C++20新特性—线程支持库

C++20线程库增加的内容主要包括两方面:jthread及相关的stop_token等;用于线程同步的semaphore等。

一、joinable和stoppable的jthread

1. jthread

std::jthread也在<thread>中定义,基本与std::thread相同,不同在于:

  • 在析构时,自动join到主线程,此时写法上比单纯用sth::thread简洁些
  • 可以在线程外终止此线程的执行,jthread内部有一个std::stop_source对象,而stop_source又可关联stop_token,stop_callback,它们共同实现外部状态通知等功能。

为完成上面功能2,jthread的入口函数与thread稍有不同,如果入口函数f定义的第一个参数是std::stop_token而调用时并没有给,则jthread会自动将自身维护的stop_token作为第一个参数传给入口函数,即jthread内部在调用入口函数f时,会有如下的两种形式:

1  std::invoke(decay_copy(std::forward<Function>(f)), 
            decay_copy(std::forward<Args>(args))...);
2  std::invoke(decay_copy(std::forward<Function>(f)),
            get_stop_token(),
            decay_copy(std::forward<Args>(args))...);

其中1与thread的方式相同,2是将内部的stop_token作为第一个参数传给入口函数,而外部提供给入口函数的参数中可不包含stop_token。下例中,三种使用jthread都是正确的。

int test_jthread()
{
	auto worker1=[] (std::stop_token token,int i) {
		std::cout<<"worker1 thread " << i<<"\n";
	};
	auto worker2=[] (int i) {
		std::cout<<"worker2 thread "<< i<<"\n";
	};	
    std::stop_token token;
    std::jthread  th1(worker1,1);   // th1.get_stop_token() as the f
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值