[英]How thread.join() works?
我無法理解thread.join();
我已經瀏覽了文件以供解釋,但沒有用。 以下程序是我們任務的一部分,並使用pthreads模擬Petersons解決方案。
#include<iostream>
#include<thread>
#include<mutex>
using namespace std;
bool flag[2];
char turn;
mutex mux1;
mutex mux2;
void first(int num)
{
flag[0] = true;
turn = 'j';
while ( turn == 'j' && flag[1] == true )
;
mux1.lock();
cout<<" in critical section of i with thread number "<<num<<endl;
mux1.unlock();
flag[0] = false;
}
void second(int num)
{
flag[1] = true;
turn = 'i';
while ( turn == 'i' && flag[0] == true )
;
mux2.lock();
cout<<" in critical section of j with thread number "<<num<<endl;
mux2.unlock();
flag[1] = false;
}
int main()
{
thread k[3];
thread j[3];
for(int i=0;i<3;i++)
j[i] = thread(second,i);
for(int i=0;i<3;i++)
k[i] = thread(first,i);
for(int i=0;i<3;i++)
{
j[i].join();
k[i].join();
}
return 0;
}
我特別關注的問題是:
thread.join()的cppreference中的以下行
阻止當前線程,直到* this標識的線程完成其執行。
由*標識的線程的完成與join()的相應成功返回同步。
這是哪個線程*? ,以及多個連接的線程如何執行以及以什么順序執行?
如果可以參考代碼提供解釋,那將是非常直觀的。
*這是一個指針,指的是處理您正在處理的線程的實際線程
例如,如果你這樣做
main(){
std::thread foo(x);
foo.join();
}
擁有主函數的線程將被阻塞,直到foo完成!
對於第二部分,您的問題的第一部分已經有了答案
[...]多個連接的線程如何執行以及以什么順序執行?
一旦加入,線程就不再執行,因為join
阻塞直到線程完成執行。 如果你沒有實現專門的措施,你不知道線程執行的順序,即使你有
t1.join();
t2.join();
可能是t2
在t1
之前完成,但是你的程序將首先等待t1
完成,然后才等待t2
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.