C++ 线程库与多线程编程实战
在 Linux 平台下,我们通常通过原生 pthread 线程库管理线程,包括创建、等待与退出等操作。然而,pthread 遵循 POSIX 标准,主要适用于类 Unix 系统。Windows 则提供了一套不同的接口。C++ 作为跨平台语言,自 C++11 起引入了标准线程库,屏蔽了底层操作系统的差异,让我们能用同一套代码在多种平台上进行多线程开发。
thread 类的跨平台机制
C++ 将线程抽象为 thread 对象,封装了关键属性与操作(如 join、detach)。为了在不同操作系统上实现统一的接口,线程库内部采用了条件编译机制。
条件编译在预处理阶段根据宏定义决定是否编译某段代码,这与运行时的 if-else 不同。例如:
#if defined(VERSION)
#if VERSION == 0
std::cout << "Version 1" << std::endl;
#elif VERSION == 1
std::cout << "Version 2" << std::endl;
#endif
#endif
编译器在编译时会隐式定义平台检测宏(如 _WIN32、__linux__)。线程库利用这些宏选择对应的底层实现:Linux 下封装 pthread,Windows 下封装 Windows API。对用户而言,无论底层如何切换,thread 类的接口始终一致。
构造与可调用对象
thread 类的设计遵循面向对象思想。相比 C 风格的 pthread_create 只能传递函数指针,C++ 的构造函数支持任意可调用对象(Callable Object),包括函数指针、仿函数、Lambda 表达式等。
这意味着我们可以直接传递参数,无需像 C 语言那样打包结构体:
#include <iostream>
#include <thread>
void print(size_t i, size_t j) {
for (; i < j; ++i) {
std::cout << "I am a thread" << std::endl;
}
}
int main() {
std::thread t1;
t();
;
}


