根据满足的条件尝试按顺序将两个任务排队。基本上,task1必须在task2排队之前完成。下面的代码是实现此目的的有效方法吗?假设正在使用至少3个线程。 bTask1和bTask2仅用于退出while循环。我对val是引起争用条件还是替换锁的有效方法更感兴趣。如果不是,使用OMP锁定机制按顺序执行task1和task2的最小方法是什么?在实际情况下,我将需要按照一定顺序执行一堆并行任务(即,从叶子到根的异步树遍历)。
编辑:下面的代码在无限循环中结束。有人知道为什么吗?
EDIT2:代码适用于O0,但不适用于O3优化。确认O0仍会产生多线程行为。我不喜欢这要去的地方:(
int val = 0;
bool bTask1 = true, bTask2 = true;
#pragma omp parallel default(none) shared(cout, bTask1, bTask2, val) num_threads(4)
{
#pragma omp single nowait
{
while(bTask1) {
if(val == 0) {
val = -1;
#pragma omp task shared(cout, val, bTask1)
{
cout << "Hello from task 1" << endl;
val = -2;
bTask1 = false;
}
}
// cout << "1" << endl;
}
}
#pragma omp single nowait
{
while(bTask2) {
if(val == -2) {
val = -3;
#pragma omp task shared(cout, val, bTask2)
{
cout << "Hello from task 2" << endl;
val = -4;
bTask2 = false;
}
}
// cout << "2" << endl;
}
}
}