簡體   English   中英

thread.join()如何工作?

[英]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();

可能是t2t1之前完成,但是你的程序將首先等待t1完成,然后才等待t2

暫無
暫無

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

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