簡體   English   中英

thread.join() 在多線程中做了什么?

[英]What thread.join() do in multithreading?

我試圖了解 C / C++ 中的線程連接。 我知道了

std::thread::join() function 使當前線程等待,直到 *this 標識的線程完成執行。

但我不明白為什么連接 function 的定位很重要,為什么這兩個代碼的工作方式不同。

代碼1:

#include <iostream>
#include <thread>
#include<vector>
#include <unistd.h>

using namespace std;

void func(int x)
{
  sleep(100);
  cout<<x<<endl;
}

int main() {
  
  vector<thread> a;

  for(int i=0;i<10;i++)
  {
    a.emplace_back(func,i);
  }

  for (auto &thr : a) {
      thr.join();
      cout<<"next"<<endl;
  }

  cout<<"finish"<<endl;
}

Output:

01
3

next
9
7
45
6
8
2next


next
next
next
next
next
next
next
next
finish

代碼 2:

#include <iostream>
#include <thread>
#include<vector>
#include <unistd.h>

using namespace std;

void func(int x)
{
  sleep(100);
  cout<<x<<endl;
}

int main() {
  
  vector<thread> a;

  for(int i=0;i<10;i++)
  {
    a.emplace_back(func,i);
    a.back().join();
    cout<<"next"<<endl;
  }

  cout<<"finish"<<endl;
}

Output:

0
next
1
next
2
next
3
next
4
next
5
next
6
next
7
next
8
next
9
next
finish

起初我認為在代碼 1 中,當我稍后加入線程時,它們可能已經執行並完成了,但是增加了睡眠時間會給出相同的結果。 所以,我很困惑。

在您的第一個代碼版本中,此塊

  for(int i=0;i<10;i++)
  {
    a.emplace_back(func,i);
  }

做兩件事,它創建一個std::thread實例並啟動線程。 現在這些線程被允許運行,直到主線程在它們上調用join() ,就像在下一段代碼中一樣,

  for (auto &thr : a) {
      thr.join();
      cout<<"next"<<endl;
  }

那么你,

  1. 創建所有線程
  2. 讓他們都跑
  3. 對它們一一調用join()

在您的版本 2 中,您再次創建線程,但隨后通過back()立即在最后插入的線程上調用join() ,即剛剛創建的線程。

  for(int i=0;i<10;i++)
  {
    a.emplace_back(func,i);
    a.back().join();
    cout<<"next"<<endl;
  }

因此,每個線程都被啟動,運行到完成,然后被調用join() 您實際上是序列化線程,因此是 output。 所以你在這里,

  1. 創建單個線程
  2. 讓它運行
  3. 調用join()就可以了。
  4. 對所有線程重復此操作。

在第一個片段中,您啟動所有線程,然后等待所有線程。 在第二個片段中,您等待一個線程在啟動后立即完成,然后再繼續下一個,因此一次只運行一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM