std::jthread与std::thread的区别

本文探讨了C++20引入std::jthread的原因,它相较于std::thread新增了线程终止和析构自动join功能,以降低性能开销。作者解释了为何不扩展std::thread接口,而是创建独立库,遵循了C++的设计原则。

特性上,std::jthread相比std::thread主要增加了以下两个功能:

1.std::jthread对象被destruct时,会自动调用join,等待其所表示的执行流结束。

2.支持外部请求中止(通过get_stop_source、get_stop_token和request_stop)。

为什么不是选择往std::thread添加新接口,而是引入了一个新的标准库?

因为std::jthread为了实现上述新功能,带来了额外的性能开销(主要是多了一个成员变量)。而根据C++一直以来“不为不使用的功能付费”的设计哲学,他们自然就把这些新功能拆出来新做了一个类。

// C++20新线程 jthread 体验代码
//
// 编译(编译本代码,-pedantic 不是必须的):
// g++ -std=c++20 -Wall -pedantic -pthread -static-libstdc++ C++20_jthread.cpp -o C++20_jthread
//
// 要求GCC10及以上版本,
// 可使用GCC的Docker镜像静态链接stdc++库,以方便在非GCC10环境运行。
//
// docker pull gcc
// docker run --rm -it -v /data:/data gcc
#include <chrono>
//#include <coroutine> // -fcoroutines
#include <iostream>
#include <stdexcept>
#include <thread>

// 线程执行体
void thread_proc(std::stop_token st)
{
  // 以往中,
  // 需要自己实现 stop 来停止线程,
  // 现在 jthread 内置了此能力。
  while (!st.stop_requested())  
    std::this_thread::sleep_for(std::chrono::seconds(1));  
  std::cout << "Thread " << std::this_thread::get_id() << " exit" << std::endl;
}

extern "C"
int main()
{
  std::jthread thr(&thread_proc); // 创建线程
  std::this_thread::sleep_for(std::chrono::seconds(10));
  thr.request_stop(); // 通知线程退出
  thr.join();
  return 0;
}

第二个特征jthread是帮助我们解决std::thread以前导致的困境:joindetach*。现在jthread来承担一些责任。它的析构函数简单地实现为:

这正是我们在上面的示例中所做的,因此我们可以删除那里的最后两行,如下:

即main的最后,我们不用join了,jthread对象被析构时,会自动调用join函数

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值