join的作用就是暂时阻塞主线程,从而使得子线程能够在主线程结束之前执行完,我这里想用一个fir循环延长主进程进度从而也达到让子线程在主线程结束之前执行完,但是报错了,是不是必须得用join?
c++多线程 关于join()
join的作用就是暂时阻塞主线程,从而使得子线程能够在主线程结束之前执行完,我这里想用一个fir循环延长主进程进度从而也达到让子线程在主线程结束之前执行完,但是报错了,是不是必须得用join?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 PADS Logic 原理图
- ¥15 PADS Logic 图标
- ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
- ¥20 气象站点数据求取中~
- ¥15 如何获取APP内弹出的网址链接
- ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
- ¥50 STM32单片机传感器读取错误
- ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
- ¥15 机器人轨迹规划相关问题
- ¥15 word样式右侧翻页键消失