c++多线程编程:join()函数与detch()函数的区别。

join函数与detch

  • 在一个线程中,开了另一个线程去干另一件事,使用join函数后,原始线程会等待新线程执行结束之后,再去销毁线程对象。
  • 这样有什么好处?---->因为它要等到新线程执行完,再销毁,线程对象,这样如果新线程使用了共享变量,等到新线程执行完再销毁这个线程对象,不会产生异常。如果不使用join,使用detch,那么新线程就会与原线程分离,如果原线程先执行完毕,销毁线程对象及局部变量,并且新线程有共享变量或引用之类,这样新线程可能使用的变量,就变成未定义,产生异常或不可预测的错误。
  • 所以,当你确定程序没有使用共享变量或引用之类的话,可以使用detch函数,分离线程。
  • 但是使用join可能会造成性能损失,因为原始线程要等待新线程的完成,所以有些情况(前提是你知道这种情况,如上)使用detch会更好。

运用上面的原理分析下面程序的结果。

#include <iostream>
#include <thread>
#include <windows.h>
void func(){
    for (int i = 0; i < 100; ++i) {
        std::cout<<"thread::func"<<std::endl;
    }
}
int main() {
    std::thread my_thread(func);
//    Sleep(1);
    my_thread.detach();
//    my_thread.join();
    return 0;
}
  • 结果:
    在这里插入图片描述
  • 由于使用的是detch函数,新线程与主线程分离,在detch函数执行完成,主线程main函数结束,my_thread对象销毁,还未执行一次打印线程也就结束了,这才造成这样的结果。下面我们加上Sleep(1);这句话,观察结果,验证我们的说法。
  • 结果:
    在这里插入图片描述
  • 我们在执行线程分离前sleep1微秒,这样线程有机会完成几次打印,结果验证了前面的说法。
  • 如果代码变成使用join函数
#include <iostream>
#include <thread>
#include <windows.h>
void func(){
    for (int i = 0; i < 100; ++i) {
        std::cout<<"thread::func"<<std::endl;
    }
}
int main() {
    std::thread my_thread(func);
//    Sleep(1);
//    my_thread.detach();
    my_thread.join();
    return 0;
}
  • 结果:打印100次的thread::func
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值