当我执行下面的代码时,shell输出可能在线程0和线程1之间重叠。 所以我想问一下,在另一个线程开始输出之前,确保每个线程完成输出写入的最佳方法是什么?
这样可以确保输出干净。
非常感谢提前!
#pragma omp parallel num_threads(2) shared(emperor)
{
#pragma omp sections
{
#pragma omp section
{
cout << "Open the listening thread by using openmp!" << endl;
emperor->startServerListening(); /// does some work
}
#pragma omp section
{
cout << "Open the master thread by using openmp!" << endl;
emperor->startServerCoupling(); /// does some other work
}
} /// End of sections
} /// End of parallel section
答案 0 :(得分:0)
最直接的方法是使用临界区,以便一次只有一个线程写入输出:
#pragma omp parallel num_threads(2) shared(emperor)
{
#pragma omp sections
{
#pragma omp section
{
#pragma omp critical (cout)
cout << "Open the listening thread by using openmp!" << endl;
emperor->startServerListening(); /// does some work
}
#pragma omp section
{
#pragma omp critical (cout)
cout << "Open the master thread by using openmp!" << endl;
emperor->startServerCoupling(); /// does some other work
}
} /// End of sections
} /// End of parallel section
您可以使用命名的关键部分来标识独占部分,即命名部分对于具有相同名称的所有部分(一次一个部分中的一个线程)是独占的。未命名的部分是所有其他未命名部分所独有的。