【问题标题】:Threading concepts c++线程概念 c++
【发布时间】:2021-12-28 13:39:29
【问题描述】:
int main(){
std::thread t1(findEven, start, end, &(EvenSum));
    std::thread t2(findOdd, start, end, &(OddSum));
 
    t1.join();
    t2.join();
}

假设 findEven 和 findOdd 是一些已经编写好的函数。 为了更好地理解,这是代码Link to Code

在理解线程概念方面有一些困难并想检查我的理解是否正确? 我的主线程创建了一个新线程 T1 并运行了函数 Evensum 。它没有等待 evensum 完成并返回并再次启动一个新线程 T2 并同时运行 findodd 。现在 t1 和 t2 都在同时运行。没关系。 现在它击中 t1.join () 。是不是说只要t1没有完成就没有到达t2.join()这行?

【问题讨论】:

  • 是的。你的理解是正确的。 t2,join 只有在 t1 完成其工作时才会触发。
  • 嘿,但为什么会这样呢?我的意思是这样做的逻辑是什么?我想了解这背后的哲学。
  • join 就是这样工作的。在调用join 的线程完成执行之前,它不允许调用join 的线程继续运行。
  • 如果您不希望这样,请查看使用 std::async 并返回 std::future 对象。
  • join 的全部意义在于“等到线程执行完毕,然后继续”。还有其他工具可用于以不同方式同步线程。不确定它是否有任何哲学,更重要的是,有时能够等到某个线程完成是非常有用的。

标签: c++ multithreading


【解决方案1】:

你的理解是完全正确的。

  1. 线程调用只是触发事物并让它独立运行(除非您提供额外的选项,例如“等待启动”,以便稍后根据需要激活创建的线程)。
  2. 一旦被要求加入,当前(主?)线程将暂停,直到关联线程发出已完成的信号。如果有多个线程,您可以等待所有线程,也可以根据需要等待任何线程。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2013-09-07
  • 2018-12-18
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多