推荐答案
// www.javascriptcn.com code example
#include <iostream>
#include <thread>
#include <chrono>
void worker() {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Worker thread finished.\n";
}
int main() {
std::jthread t(worker); // 自动管理线程生命周期
std::cout << "Main thread waiting for worker thread...\n";
// 不需要显式调用 join(),std::jthread 在析构时会自动等待线程结束
return 0;
}本题详细解读
std::jthread 简介
std::jthread 是 C++20 中引入的一个新特性,它是 std::thread 的改进版本。与 std::thread 不同,std::jthread 在析构时会自动调用 join(),确保线程在对象销毁前完成执行。这避免了因忘记调用 join() 或 detach() 而导致的资源泄漏或未定义行为。
std::jthread 的主要特点
- 自动管理线程生命周期:
std::jthread在析构时会自动调用join(),确保线程在对象销毁前完成执行。 - 支持停止请求:
std::jthread可以与std::stop_token配合使用,允许线程在执行过程中响应停止请求。 - 简化线程管理:由于
std::jthread自动管理线程的生命周期,开发者不需要显式调用join()或detach(),减少了出错的可能性。
std::jthread 的基本用法
- 创建线程:与
std::thread类似,可以通过传递一个可调用对象(如函数、lambda 表达式等)来创建std::jthread。 - 自动等待线程结束:
std::jthread在析构时会自动调用join(),因此不需要显式调用join()。
示例代码解析
// www.javascriptcn.com code example
#include <iostream>
#include <thread>
#include <chrono>
void worker() {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Worker thread finished.\n";
}
int main() {
std::jthread t(worker); // 创建并启动线程
std::cout << "Main thread waiting for worker thread...\n";
// 不需要显式调用 join(),std::jthread 在析构时会自动等待线程结束
return 0;
}- worker 函数:模拟一个耗时操作,线程会休眠 1 秒后输出一条消息。
- std::jthread t(worker):创建一个
std::jthread对象t,并启动线程执行worker函数。 - 自动等待线程结束:在
main函数结束时,t对象会被销毁,std::jthread会自动调用join(),确保worker线程执行完毕。
与 std::thread 的对比
- std::thread:需要显式调用
join()或detach(),否则会导致程序终止。 - std::jthread:自动管理线程生命周期,简化了线程管理,减少了出错的可能性。
总结
std::jthread 是 C++20 中引入的一个非常有用的工具,它简化了线程管理,避免了因忘记调用 join() 或 detach() 而导致的资源泄漏或未定义行为。通过自动管理线程生命周期,std::jthread 使得多线程编程更加安全和便捷。