Windows 多线程编程允许程序同时运行多个线程,提高程序的并发性和执行效率。多线程编程中的核心概念包括线程的创建、同步、调度、数据共享和竞争条件等。本文详细介绍了 Windows 多线程编程的关键技术点,并解释如何使用线程同步机制来保证线程安全。
1. 线程基础概念
1.1 线程
线程是操作系统能够独立调度的最小执行单元。一个进程可以包含多个线程,这些线程共享进程的地址空间和资源。多线程编程通过并发执行多个线程,提升程序性能,特别是在 I/O 操作、网络请求或图像处理等任务中。
1.2 进程 vs. 线程
进程:程序在操作系统中的运行实例。每个进程有独立的地址空间和资源。
线程:线程是进程中的轻量级执行单元,多个线程可以共享进程的内存和资源。一个进程至少包含一个主线程,可以派生出多个子线程。
2. 线程的创建与管理
在 Windows 中,创建和管理线程可以通过 WinAPI 提供的多种方法,其中常用的是 CreateThread 和 C++11 提供的标准库线程类。
2.1 使用 CreateThread
这是 WinAPI 中直接用于创建线程的函数,它返回一个线程句柄,用于管理线程。
#include <windows.h>
#include <iostream>
// 线程函数
DWORD WINAPI ThreadFunc(LPVOID lpParam) {
for (int i = 0; i < 5; i++) {
std::cout << "Thread running...\n";
Sleep(1000); // 模拟工作,暂停1秒
}
return 0;
}
int main() {
HANDLE hThread = CreateThread(
NULL, // 默认安全属性
0, // 默认堆栈大小
ThreadFunc, // 线程函数
NULL, // 参数传递给线程函数
0, // 默认创建标志
NULL // 可选的线程ID
);
if (hThread == NULL) {
std::cout << "Error: Unable to create thread\n";
return 1;
}
// 等待线程结束
WaitForSingleObject(hThread, INFINITE);
// 关闭线程句柄
CloseHandle(hThread);
return 0;
}
2.2 使用 C++11 std::thread
现代 C++ 提供了跨平台的 std::thread 类,用来简化线程的创建和管理。
#include <iostream>
#include <thread>
void ThreadFunc() {
for (int i = 0; i < 5; i++) {
std::cout << "Thread running...\n";
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
}
}
int main() {
std::thread t(ThreadFunc); // 创建线程
t.join(); // 等待线程结束
return 0;
}
3. 线程同步
在多线程程序中,多个线程可能会同时访问共享资源(如内存、文件等),如果不加以控制,可能会导致数据竞态条件(Race Condition)。线程同步用于协调线程对共享资源的访问,避免数据冲突。
- 常用的同步机制包括:
临界区(Critical Section)
互斥量(Mutex)
信号量(Semaphore)
事件(Event)
3.1 临界区(Critical Section)
临界区是一种轻量级的同步机制,仅适用于单进程的线程同步。临界区在同一时间只允许一个线程进入,其他线程必须等待当前线程离开临界区后才能进入。
#include <windows.h>
#include <iostream>
CRITICAL_SECTION criticalSection;