std::thread 的 join 和 detach 方法

背景

在 C++ 中使用一个可调用对象构造一个 std::thread 对象,即可创建一个线程。

join 和 detach

①.join():当线程结束时 join 函数返回,就是阻塞调用线程,让调用线程等待子线程执行完毕,然后再往下执行。

#include "thread"
#include "iostream"
using namespace std;
void functionToThread()
{
  cout << "线程启动......" << endl;

  cout << "线程结束......" << endl;
}
int main()
{

  thread myThread(functionToThread);
  myThread.join();//阻塞等待线程结束
  
   return 0;
}

②.detach():分离,调用线程不再等待子线程结束,执行 detach 后,子线程和调用线程失去关联,驻留在后台,由 C++ 运行时库接管。

#include "thread"
#include "iostream"
using namespace std;
void functionToThread()
{
  cout << "线程启动......" << endl;

  cout << "线程结束......" << endl;
}
int main()
{

  thread myThread(functionToThread);
  myThread.detach();//分离线程,不阻塞
  
   return 0;
}

可联结性

一个 std::thread 对象只可能处于可联结或不可联结两种状态之一。即 std::thread 对象是否与某个有效的底层线程关联。
①.可联结:当线程可运行、已经运行或处于阻塞时是可联结的。但如果某个底层线程已经执行完任务,但是没有被 join 的话,该线程依然会被认为是一个活动的执行线程,仍然处于 joinable 状态。
②.不可联结:不带参构造的std::thread对象为不可联结,因为底层线程还没创建;已经移动的std::thread对象为不可联结;已经调用join或detach的对象为不可联结状态。
③.joinable():判断是否可以成功使用 join() 或者 detach() ,返回true 表示可以,否则返回 false。

#include "thread"
#include "iostream"
using namespace std;
void functionToThread()
{
  cout << "线程启动......" << endl;

  cout << "线程结束......" << endl;
}
int main()
{

  thread myThread(functionToThread);
  if( myThread.joinable() )//可联结
  {
      myThread.join();//阻塞等待线程结束
  }
  
   return 0;
}

std::thread 对象析构

std::thread 对象析构时,会先判断 joinable() ,如果可联结,则程序会直接被终止(terminate)。
因此,在创建 thread 对象以后,要在随后的某个地方显式地调用 join 或 detach 以便让 std::thread 处于不可联结状态。
在这里插入图片描述

在这里插入图片描述

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值