返回信息流背景:
线程创建后,必须执行join()或detach()
thread t([=](){
int i = 0;
while(1){cout<<i<<endl;}
});
t.join();
//t.detach();
join()的执行效果是让当前主线程等待直到子线程t执行完,才执行主线程join之后的内容
疑问:
感觉join()有点鸡肋,从用法上看是个线程同步的工具,然而只能在主线程当前的函数中调用(除非将t的引用通过返回值之类的传出去),于是从结果上看,就变成了单线程执行了。。。
不知各位怎么看?
这是一条镜像帖。来源:北邮人论坛 / cpp / #92587同步于 2016/7/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[讨论]关于C++11中thread的join()和detach()
cyf333333
2016/7/17镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你可以创建多一点线程再join啊。
void f(int from, int to) {
// compute...
}
int main() {
thread ths[1000];
for (int i = 0; i < 1000; i ++) {
ths[i] = thread(f, i*500, (i+1)*500)
}
for (int i = 0; i < 1000; i ++) {
ths[i].join();
}
printf("All done!\n");
return 0;
}
最后循环join()的时候,这个循环会卡在join那一行,直到对应的线程跑完,才去join后面的,感觉有点怪怪的[ema27]而且如果应用场景是这样的:函数A调用函数B,函数B中创建线程t,我需要在A的最后再执行t的join,就必须把t通过某种方式从B中传出来,有什么更科学的设计方案么
【 在 nuanyangyang 的大作中提到: 】
: 你可以创建多一点线程再join啊。
: [code=cpp]
: void f(int from, int to) {
: ...................
【 在 cyf333333 的大作中提到: 】
: 最后循环join()的时候,这个循环会卡在join那一行,直到对应的线程跑完,才去join后面的,
是这样的。
: 感觉有点怪怪的而且如果应用场景是这样的:函数A调用函数B,函数B中创建线程t,我需要在A的最后再执行t的join,就必须把t通过某种方式从B中传出来,有什么更科学的设计方案么
你需要做什么呢?如果每个task可以创建更多的task,最后要等所有的task完成之后再继续,不妨试试ForkJoinPool
【 在 cyf333333 的大作中提到: 】
: 最后循环join()的时候,这个循环会卡在join那一行,直到对应的线程跑完,才去join后面的,感觉有点怪怪的而且如果应用场景是这样的:函数A调用函数B,函数B中创建线程t,我需要在A的最后再执行t的join,就必须把t通过某种方式从B中传出来,有什么更科学的设计方案么
哦,忘了是C++。
另一种方案是,既然B创建了t,就让B去join t。这样,A join B以后,就确定t也完成了。
但我现在想在t运行的同时,继续把A跑完,跑到最后再去检查t的状态,如果在B里面join t,那么A就一直卡在调用B的地方了
【 在 nuanyangyang 的大作中提到: 】
:
: 哦,忘了是C++。
: 另一种方案是,既然B创建了t,就让B去join t。这样,A join B以后,就确定t也完成了。
【 在 cyf333333 的大作中提到: 】
: 但我现在想在t运行的同时,继续把A跑完,跑到最后再去检查t的状态,如果在B里面join t,那么A就一直卡在调用B的地方了
听起来,你的A知道“B将会创建一个t”。既然如此,让B以某种方式把t的存在告知A,也是可以的。
所以我一直觉得这样不太科学,从设计上来说必须多一个参数
【 在 nuanyangyang 的大作中提到: 】
:
: 听起来,你的A知道“B将会创建一个t”。既然如此,让B以某种方式把t的存在告知A,也是可以的。