ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++多线程中的join, detach, joinable

2022-07-27 21:33:47  阅读:148  来源: 互联网

标签:joinable 多线程 join 函数 thread 线程 detach


thread对象构造完成(线程开始执行)之后,对象析构之前,我们必须选择是等待它(join)或者让它在后台运行(detach),如果你在thread对象析构前没有这么做,那么线程将会终止,因为thread的析构函数中调用了std::terminate()。
join的意思是父线程等待子线程结束
detach的含义是主线程和子线程相互分离,但是主线程结束了,子线程也会结束。

joinable()函数是一个布尔类型的函数,他会返回一个布尔值来表示当前的线程是否是可执行线程(能被join或者detach),因为相同的线程不能join两次,也不能join完再detach,同理也不能detach完再join,所以joinable函数就是用来判断当前这个线程是否可以joinable的。通常不能被joinable有以下几种情况:

   1)由thread的缺省构造函数而造成的(thread()没有参数)。

   2)该thread被move过(包括move构造和move赋值)。

   3)该线程被join或者detach过。

线程没有执行join和detach时:

#include <iostream>
#include <thread>
#include <unistd.h>

using namespace std;
void func2(){
    cout<<"22222"<<endl;
}
 
void func(){
    cout<<"11111111"<<endl;
    thread t(func2);
    cout<<"33333333"<<endl;
}

int main(){
    func();
    cout<<"main"<<endl;

    sleep(10);

    return 0;
}

结果:

g++ -Wall -g -std=c++11 -pthread test2.cpp -o test2
./test2 
11111111
33333333
terminate called without an active exception
Aborted (core dumped)

在函数func中,启动线程t,但是线程t没有执行join或detach,那么在函数func执行完毕的时候就会发生错误,从而中断整个程序。

使用detach时,如果子线程还没清理垃圾,主线程就结束了,那么就会导致内存溢出

C++多线程,请参考此链接进行学习

参考:C++多线程中的join, detach, joinable

标签:joinable,多线程,join,函数,thread,线程,detach
来源: https://www.cnblogs.com/codingbigdog/p/16526544.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有