C++多线程编程:std::thread使用教程
在C++中使用std::thread创建多线程需包含<thread>头文件,通过创建std::thread对象传入函数、lambda或函数对象来启动线程,实现跨平台多线程编程。
在C++中使用std::thread创建多线程需包含
头文件,通过创建std::thread对象传入函数、lambda或函数对象来启动线程,实现跨平台多线程编程。

在C++中使用std::thread创建多线程非常直接。从C++11开始,标准库提供了
包含头文件并启动一个线程
要使用多线程功能,首先需要包含
示例:启动一个简单线程
#include#include void say_hello() { std::cout << "Hello from thread!" << std::endl; } int main() { std::thread t(say_hello); // 启动线程执行say_hello t.join(); // 等待线程结束 return 0; }
这里,t.join()的作用是阻塞主线程,直到子线程执行完毕。如果不调用join()或detach(),程序在主线程结束时会调用std::terminate(),导致异常退出。
传递参数给线程函数
你可以向线程函数传递参数,但需要注意:默认情况下,参数是以值拷贝方式传递的。如果需要传引用,必须使用std::ref包装。
示例:传参和引用传递
#include#include void print_value(int& x) { x = 42; std::cout << "Inside thread: x = " << x << std::endl; } int main() { int value = 10; std::thread t(print_value, std::ref(value)); // 必须用std::ref才能传引用 t.join(); std::cout << "After thread: x = " << value << std::endl; // 输出42 return 0; }
使用Lambda表达式创建线程
Lambda表达式是创建线程的常用方式,尤其适合短小的并发任务。
#include#include int main() { auto task = []() { std::cout << "Lambda thread running!" << std::endl; }; std::thread t(task); t.join(); return 0; }
也可以直接把lambda作为构造参数:
std::thread t([](){
std::cout << "Inline lambda thread!" << std::endl;
});
t.join();
分离线程(detach)
如果你不希望主线程等待子线程,可以调用detach()。这样线程会在后台独立运行,生命周期不再受std::thread对象控制。
std::thread t([]{
for(int i = 0; i < 5; ++i)
std::cout << "Detached thread: " << i << std::endl;
});
t.detach(); // 分离线程
// 主线程可能很快结束,注意输出可能不完整
注意:detach()后无法再join(),且需确保被访问的数据在分离线程运行期间仍然有效。
基本上就这些。掌握std::thread的创建、参数传递、join与detach,就具备了C++多线程编程的基础能力。后续可以结合std::mutex、std::atomic等工具处理共享数据安全问题。


































