C++11 std::thread

C++11 std::thread

C++11 以前,C++ 并没有统一的标准线程库,多线程代码往往依赖平台 API。
C++11 开始,标准库正式提供了 std::thread,多线程编程终于有了统一入口。

1. 基本创建方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <thread>
#include <iostream>
using namespace std;

void work()
{
cout << "thread running" << endl;
}

int main()
{
std::thread t(work);
t.join();
return 0;
}

这里 t 就代表一个新线程。

2. join 和 detach

2.1 join

1
t.join();

表示等待线程执行结束。
这通常是最常见、也最稳妥的处理方式。

2.2 detach

1
t.detach();

表示让线程独立运行,当前线程不再等待它。
这种方式用起来要更小心,因为线程生命周期就和外部对象关系没那么直观了。

3. 传参数给线程

1
2
3
4
5
6
7
8
9
10
void printNum(int n)
{
std::cout << n << std::endl;
}

int main()
{
std::thread t(printNum, 100);
t.join();
}

也可以配合 lambda:

1
2
3
std::thread t([] {
std::cout << "hello thread" << std::endl;
});

4. 一个简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <thread>
#include <iostream>
using namespace std;

int main()
{
thread t([] {
cout << "child thread id: " << this_thread::get_id() << endl;
});

cout << "main thread id: " << this_thread::get_id() << endl;
t.join();
return 0;
}

5. 使用时要注意的点

5.1 线程对象销毁前必须处理

如果 std::thread 还处于 joinable 状态就直接析构,程序会直接终止。

所以通常要么 join(),要么 detach(),不能忘。

5.2 共享数据要考虑同步

多个线程一起改同一份数据时,需要搭配互斥量、原子变量等同步工具。

5.3 线程不是越多越好

线程切换本身也有成本,任务颗粒度太小反而不划算。

总结

std::thread 是 C++ 标准线程库的基础入口。
它让线程创建、参数传递和基础管理终于摆脱了平台依赖。日常开发里,只要涉及多线程逻辑,这个类基本就是第一步。