[英]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;
}
那么你,
join()
。 在您的版本 2 中,您再次創建線程,但隨后通過back()
立即在最后插入的線程上調用join()
,即剛剛創建的線程。
for(int i=0;i<10;i++)
{
a.emplace_back(func,i);
a.back().join();
cout<<"next"<<endl;
}
因此,每個線程都被啟動,運行到完成,然后被調用join()
。 您實際上是序列化線程,因此是 output。 所以你在這里,
join()
就可以了。在第一個片段中,您啟動所有線程,然后等待所有線程。 在第二個片段中,您等待一個線程在啟動后立即完成,然后再繼續下一個,因此一次只運行一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.