前言
实现多线程(win32 API、pthread、std::thread)、线程同步(互斥量、原子变量、读写锁、条件变量、线程局部存储)、如何调试。
多线程
线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程:是多任务处理的一种特殊形式。
一般情况下,两种类型的多任务处理:基于进程和基于线程。
- 基于进程的多任务处理是程序的并发执行。
- 基于线程的多任务处理是同一程序的片段的并发执行。
- 并发:多个任务在时间片段内交替执行,表现出同时进行的效果。
- 并行:多个任务在多个处理器或处理器核上同时执行。
C++ 多线程编程涉及在一个程序中创建和管理多个并发执行的线程。
实现多线程
在C++ 11 新特性中std::thread对linux中的pthread和windows中的Win32 API进行封装,支持跨平台、移动语义等特点,本文主要使用std::thread,对pthread和Thread简单使用。
使用实现
windows下的原生API进行创建线程。
- //创建线程
- HANDLE CreateThread(
- _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性
- _In_ SIZE_T dwStackSize, // 堆栈大小
- _In_ LPTHREAD_START_ROUTINE lpStartAddress, // 线程函数地址
- _In_opt_ LPVOID lpParameter, // 线程参数
- _In_ DWORD dwCreationFlags, // 创建标志
- _Out_opt_ LPDWORD lpThreadId // 接收线程ID
- );
- //关闭句柄
- CloseHandle(
- _In_ _Post_ptr_invalid_ HANDLE hObject
- );
- //待线程结束
- //等待事件、信号量等同步对象
- DWORD WaitForSingleObject(
- _In_ HANDLE hHandle, // 要等待的对象句柄
- _In_ DWORD dwMilliseconds // 超时时间(毫秒)
- );
- // 使用标志变量让线程自然退出
- // 使用事件对象通知线程退出
- BOOL TerminateThread(
- _In_ HANDLE hThread, // 要终止的线程句柄
- _In_ DWORD dwExitCode // 线程退出码
- );
- // 检查线程是否仍在运行
- // 获取线程的执行结果
- // 调试和错误处理
- BOOL GetExitCodeThread(
- _In_ HANDLE hThread, // 线程句柄
- _Out_ LPDWORD lpExitCode // 接收退出码的指针
- );
- // 设置当前线程属性(优先级、亲和性等)
- // 在线程函数中操作自身
- HANDLE GetCurrentThread(VOID); // 无参数,返回当前线程伪句柄
复制代码 [code]#include #include using namespace std;DWORD WINAPI threadrun(LPVOID lpParamter){ for (int i = 0; i < 10; i++) { cout |