多线程 multithreading
c语言中文网 多线程系列 多线程编程(C语言+Linux)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
c语言中文网 Linux Mutex互斥锁详解
cppreference std::mutex
提高计算机资源利用率的方法。
多进程编程:让多个程序同时执行。进程指的是正在执行的应用程序。
多线程编程:多核基础上,让多个程序同时执行。线程指的是执行应用程序中的某个具体任务,比如一段程序、一个函数等。
多道批处理系统主要有以下两点优势:
- 它将计算机的内存分成很多区域,每个区域都可以存储一个程序;(一开始给每个程序分配一部分内存,参见《计算机科学速成课(二)》)
- 当执行的程序执行 I/O 操作时(io操作,只是读写操作,cpu没有在计算,因此是空闲的),操作系统会将 CPU 资源分配给其它等待执行的程序。
早期的多任务操作系统,以进程为单位管理各个程序的运行以及计算机资源的分配和回收,进一步提高了计算机资源的利用率。但随着计算机硬、软件的发展,人们发现还可以做进一步优化,例如:
- 操作系统将 CPU 资源从一个进程分配给另一个进程时,开销较大;
- 各个进程占用的内存空间是相互独立的,大大增加了进程间通信的实现难度;
- 一个进程可能会执行多个任务,当某个任务因 I/O 操作暂停执行时,其他任务将无法执行。
在计算机软、硬件快速发展,人们计算机运行效率的要求越来越高的大背景下,“线程”应运而生。
每个进程执行前,操作系统都会为其分配所需的资源,包括要执行的程序代码、数据、内存空间、文件资源等。一个进程至少包含 1 个线程,可以包含多个线程,所有线程共享进程的资源,各个线程也可以拥有属于自己的私有资源。
进程仅负责为各个线程提供所需的资源,真正执行任务的是线程,而不是进程。
下图描述了进程和线程之间的关系:
如图所示,所有线程共享的进程资源有:
- 代码:即应用程序的代码;
- 数据:包括全局变量、函数内的静态变量、堆空间的数据等;
- 进程空间:操作系统分配给进程的内存空间;
- 打开的文件:各个线程打开的文件资源,也可以为所有线程所共享,例如线程 A 打开的文件允许线程 B 进行读写操作。
各个线程也可以拥有自己的私有资源,包括寄存器中存储的数据、线程执行所需的局部变量(函数参数)等。
C++多线程编程要注意什么?
chatgpt
在 C++ 中进行多线程编程时需要注意以下事项:
- 线程安全:在多线程环境中,多个线程可能会同时访问同一个变量或资源。要确保在并发访问时不会出现竞态条件和数据竞争等问题,需要使用互斥量、读写锁、条件变量等同步机制来保证线程安全。
- 死锁:在使用互斥量等同步机制时,如果线程持有一个锁并试图获取另一个锁,而另一个锁已经被另一个线程占用,则可能发生死锁。要避免死锁,需要避免循环等待、尽量避免使用多个锁等策略。
- 上下文切换:线程的创建和销毁、线程之间的切换都需要消耗系统资源,因此过多的线程会导致上下文切换频繁,影响性能。需要根据实际情况合理控制线程的数量。
- 线程间通信:在多线程编程中,线程之间需要进行通信,共享数据或者传递消息等。需要使用同步机制来保证线程间的通信安全。
- 内存管理:多线程环境中,内存管理也需要注意线程安全问题。例如,线程A分配了一块内存,但是在使用之前被线程B释放,这将导致未定义的行为和程序崩溃。
除了上述几点,还需要注意线程的优先级、线程的创建顺序等问题。多线程编程比较复杂,需要仔细考虑各种情况,确保程序的正确性和性能。