我无法理解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()的相应成功返回同步。
这是哪个线程? ,以及多个连接的线程如何执行以及按什么顺序执行?
如果可以参考代码提供解释,那将是非常直观的。
答案 0 :(得分:2)
*这是一个指针,指的是处理您正在处理的线程的实际线程
e.g。如果你这样做
main(){
std::thread foo(x);
foo.join();
}
然后拥有main函数的线程将被阻塞,直到foo完成!
答案 1 :(得分:1)
对于第二部分
,您的问题的第一部分已经有了答案[...]多个连接的线程如何执行以及按什么顺序执行?
一旦加入,线程就不再执行了,因为join
会阻塞,直到线程完成执行。如果你没有实现专门的措施,你不知道线程执行的顺序,即使你有
t1.join();
t2.join();
可能是t2
在t1
之前完成,但您的计划将首先等待t1
完成,然后才会t2
。