十-二 2022-05-21 20:20 采纳率: 94.3%
浏览 170
已结题

c++多线程 关于join()

img


join的作用就是暂时阻塞主线程,从而使得子线程能够在主线程结束之前执行完,我这里想用一个fir循环延长主进程进度从而也达到让子线程在主线程结束之前执行完,但是报错了,是不是必须得用join?

  • 写回答

2条回答 默认 最新

  • fortunely2 2022-05-22 01:29
    关注

    join会导致调用线程,也就是你这里的main线程阻塞,但阻塞并不是目的,join(连接)子线程的目的是为了回收已经退出的子线程资源。如果不回收资源,就会导致资源无法释放。
    回收已经退出的子线程资源,可以join,也可以detach(分离线程),让退出线程自动释放资源。
    如果是在linux系统下面使用join方式,还可以阻塞main线程或者运行loop循环,用signal机制通知main调用join回收子线程资源。

    如果使用detach方式,main线程和子线程就是两个独立的线程了,可以使用互斥锁(std::mutex)、条件变量、信号量等方式进行线程同步。

    这里以互斥锁 + 条件变量为例,让main线程等待子线程运行结束,再继续运行:

    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    
    using namespace std;
    
    std::mutex mtx;
    std::condition_variable cond;
    bool subThreadExit = false;
    
    void thread_func()
    {
        printf("sub-thread start\n");
        std::this_thread::sleep_for(chrono::seconds(2)); // 休眠2秒, 便于观察
    
        printf("sub-thread exit\n");
    
        subThreadExit = true;
        cond.notify_one(); // 唤醒等待在条件变量上的线程
    }
    
    int main()
    {
        printf("main-thread start\n");
        std::thread th1(thread_func);
        th1.detach();
    
        std::unique_lock<std::mutex> lockGuard(mtx);
        while (false == subThreadExit) {
            cond.wait(lockGuard);
        }
    
        printf("main-thread exit\n");
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月30日
  • 已采纳回答 5月22日
  • 创建了问题 5月21日

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?