学懂C++(二十二):高级教程——深入理解 C++ 多线程基础理论和概念
目录
1、线程与进程
进程
线程
区别与联系
2、并发与并行
并发
并行
3、线程的生命周期
创建(Create)
就绪(Ready)
运行(Running)
等待(Blocked/Waiting)
完成(Terminated)
4、线程调度
调度方式
线程优先级
5、线程调度示例
C++ 标准库
Windows API
在现代软件开发中,多线程编程是一个非常重要的领域。它允许程序在同一时间内执行多个任务,从而提高程序的效率和响应性。本文将深入探讨 C++ 多线程的基础理论和概念,并通过实例代码更好地理解和掌握这些知识。
1、线程与进程
进程
定义: 进程是一个运行中的程序实例,包括程序代码、数据、进程控制块(PCB)等。
特征: 1、进程拥有独立的内存空间,相互之间不能直接访问内存。
2、进程间通讯 (IPC) 方法包括管道、消息队列、共享内存等。
开销: 创建、销毁进程和进程间切换的开销较大。
线程
定义: 线程是进程中的一个执行单元,一个进程可以包含多个线程。线程拥有独立的栈和寄存器,但共享进程的堆和全局变量。
特征: 线程之间可以直接共享数据,这使得线程间通信更高效,但也带来了数据竞争问题。
开销: 线程的创建、销毁和线程间切换开销较小于进程。
区别与联系
区别:
1. 进程有独立的内存空间,线程共享进程的内存空间。
2. 进程间通讯复杂且开销大,线程间通讯简单但需要注意同步。
联系: 线程是进程的一部分,一个进程至少有一个主线程,多个线程可以并发执行。
2、并发与并行
并发
定义: 在单个处理器上,通过时间片轮转,实现多个任务在同一时间段内交替执行。目的是提高程序的响应性。
应用场景: 服务器处理多个客户端请求,图形界面程序响应用户操作。
并行
定义: 在多处理器或多核系统上,同时执行多个任务。目的是提高程序的执行效率。
应用场景: 计算密集型任务分布到多个核上并行计算,如图像处理、科学计算。
3、线程的生命周期
创建(Create)
通过调用 std::thread
构造函数或 Windows API CreateThread
创建新线程。新线程进入可执行状态。
就绪(Ready)
线程已经准备好执行,等待 CPU 调度。处于就绪队列中。
运行(Running)
线程获得 CPU 时间片开始执行。执行完时间片后进入就绪或等待状态。
等待(Blocked/Waiting)
线程等待某个条件或事件发生,如等待 I/O 操作完成、等待互斥量、条件变量等。等待事件发生后,重新进入就绪状态。
完成(Terminated)
线程的任务执行完毕或被终止。线程退出并释放资源。
4、线程调度
调度方式
- 先来先服务 (FCFS): 按线程到达顺序调度。
- 时间片轮转 (Round-Robin): 每个线程分配固定的时间片,时间片用完后切换到下一个线程。
- 优先级调度: 按线程优先级调度,高优先级线程优先执行。
线程优先级
定义: 每个线程分配一个优先级,优先级高的线程获得更多的 CPU 时间。
设置方法:
- 使用标准库: C++ 标准库没有直接提供设置线程优先级的接口,可以通过操作系统 API 实现。
- Windows API:
SetThreadPriority
函数设置线程优先级。
线程优先级的影响:
- 高优先级线程可以优先获得 CPU 时间,低优先级线程可能长时间得不到执行。
- 不当的优先级设置可能导致优先级反转问题,即低优先级线程持有高优先级线程需要的资源,导致高优先级线程长时间等待。
5、线程调度示例
C++ 标准库
#include <iostream>
#include <thread>// 线程函数
void threadFunction() {std::cout << "Thread is running!" << std::endl;
}int main() {// 创建线程std::thread t(threadFunction);// 等待线程完成t.join();return 0;
}
Windows API
#include <windows.h>
#include <iostream>// 线程函数
DWORD WINAPI ThreadFunction(LPVOID lpParam) {std::cout << "Thread is running!" << std::endl;return 0;
}int main() {// 创建线程HANDLE hThread = CreateThread(NULL, // 默认安全属性0, // 默认堆栈大小ThreadFunction, // 线程函数NULL, // 线程函数参数0, // 默认创建标志NULL // 获取线程ID);// 等待线程完成WaitForSingleObject(hThread, INFINITE);// 关闭线程句柄CloseHandle(hThread);return 0;
}
通过理解和掌握这些基础理论和概念,可以为深入学习和实践 C++ 多线程编程奠定坚实的基础。希望本文能帮助读者更好地理解和应用多线程编程技术。