OMP任务竞赛条件?有效更换锁吗?

时间:2019-12-30 17:37:21

标签: c++ parallel-processing task openmp race-condition

根据满足的条件尝试按顺序将两个任务排队。基本上,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;
            }
        }

    }

0 个答案:

没有答案