我有一个理论上的OpenMP问题。 想象一下,我做了以下几点:
#pragma omp parallel
{
#pragma omp single
{
while (!empty(linkedList)) {
#pragma omp task
doWork();
}
}
}
如果doWork()将元素添加回列表会发生什么? 我担心的是,任务旋转的单个线程将在执行任务的线程完成之前终止。这可能意味着错过了由doWork函数添加回列表的任何元素。有谁知道这是如何工作的?
谢谢!
答案 0 :(得分:0)
将生成器循环嵌入到另一个循环中并在其间使用taskwait
以确保所有任务都已完成执行。您还必须确保在代码的并发部分中正确锁定链接列表,例如通过使用关键部分(如下所示)或更细粒度的锁。
doWork(element e)
{
// ...
#pragma omp critical(listOps)
insertElement(linkedList, newElement);
// ...
}
#pragma omp parallel
{
#pragma omp single
{
do
{
#pragma omp critical(listOps)
while (!empty(linkedList)) {
element e = removeElement(linkedList);
#pragma omp task
doWork(e);
}
#pragma omp taskwait
} while (!empty(linkedList));
}
}