thread.join()如何工作?

时间:2017-05-23 12:25:09

标签: c++ operating-system synchronization pthreads

我无法理解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()的相应成功返回同步。

这是哪个线程? ,以及多个连接的线程如何执行以及按什么顺序执行?

如果可以参考代码提供解释,那将是非常直观的。

2 个答案:

答案 0 :(得分:2)

*这是一个指针,指的是处理您正在处理的线程的实际线程

e.g。如果你这样做

main(){
    std::thread foo(x);
    foo.join();
}

然后拥有main函数的线程将被阻塞,直到foo完成!

答案 1 :(得分:1)

对于第二部分

,您的问题的第一部分已经有了答案
  

[...]多个连接的线程如何执行以及按什么顺序执行?

一旦加入,线程就不再执行了,因为join会阻塞,直到线程完成执行。如果你没有实现专门的措施,你不知道线程执行的顺序,即使你有

t1.join();
t2.join();

可能是t2t1之前完成,但您的计划将首先等待t1完成,然后才会t2