【问题标题】:what happened after call std::thread::join()?调用 std::thread::join() 后发生了什么?
【发布时间】:2020-09-12 03:48:54
【问题描述】:

我是多线程初学者,cpp标准多线程库中有一些我不明白的地方:

void func(){
//do something
}
int main(){

std::vector<std::thread> threads;

for(int i=0;i<std::thread::hardware_concurrency();i++)
threads.push_back(func);

for(auto& thread:threads)
thread.join();

//do it again
for(auto& thread:threads)
thread.join();

return 0;
}

然后我的问题来了:第三个 for 循环何时到达?是在所有线程完成其工作后到达还是只需要主线程完成其工作?如果某些线程比其他线程更早完成 func(),即使在其他线程完成第一次调用之前,我如何让它调用 func()? 非常感谢您的帮助。

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    如有疑问,最好查看文档:https://en.cppreference.com/w/cpp/thread/thread/join

    阻塞当前线程,直到 *this 标识的线程完成执行。

    因此,您的第二个循环将等到向量中的所有线程都完成执行。完成所有工作后,您将只继续进行第 3 个循环。该循环基本上是一个昂贵的noop。

    注意:在 c++20 中,他们添加了std::jthread 以使使用线程更容易,您现在不再需要考虑调用join()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-02
      • 2016-09-04
      • 1970-01-01
      • 2019-11-28
      • 2017-07-25
      • 2019-05-07
      • 2020-03-02
      • 2020-01-11
      相关资源
      最近更新 更多