c++主线程等待子线程结束_C++基础 多线程笔记(一)

本文详细介绍了C++中多线程的使用,包括join和detach方法来控制主线程等待子线程,try-catch异常捕获机制确保子线程执行完毕,通过类构造子线程并使用ref方法传参,以及线程对象的mov方法。还探讨了mutex和lock_guard在资源同步中的应用,以及如何避免死锁问题。
摘要由CSDN通过智能技术生成

ade3f3efc1f73b4ea591fed4e833ae85.png

join & detach

join和detach为最基本的用法,join可以使主线程(main函数)等待子线程(自定义的function_1函数)完成后再退出程序,而detach可以使子线程与主线程毫无关联的独立运行,当主线程执行完毕后直接退出程序,不管子线程是否执行完毕。

#include<iostream>
#include<thread>
using namespace std;

// 子线程函数
void function_1()
{
    
    for(int i=10;i>0;i--) // 循环10次输出
        cout << "=============Hello=============" << endl;
}

int main()
{
    
    thread t1(function_1);//线程开始

    //t1.join();//方式1:结合(等待其完成)
    t1.detach();//方式2:分离(使其自行运行)(cout未来得及输出完毕,主线程已结束)

    cout << "~~~~~~~~~~~World~~~~~~~~~~~" << endl;

    if (t1.joinable())
    {
    
        t1.join();
    }

    return 0;
}

detach方法的执行结果如下,可以看出子线程没来得及执行完毕。

=============Hello=============
~~~~~~~~~~~World~~~~~~~~~~~
=请按任意键继续. . .

如果换成join方法,则可以输出10条Hello语句。

=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
=============Hello=============
~~~~~~~~~~~World~~~~~~~~~~~
请按任意键继续. . .

try-catch异常捕获机制的使用

join可以使某些比较重要的函数执行完毕后再退出,但当程序出现异常时,程序仍会直接退出,join没有起到应有的作用,这是可以通过try-catch异常捕获机制,结合join方法,使某些函数(子线程)在程序出现异常时也能先执行完毕再退出,例子如下,通过OpenCV读取显示一张不存在的图片产生异常。

#include<iostream>
#include<thread>
#include<opencv2/opencv.hpp>

// 子线程函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值