使用任务使用OpenMP拆分动态更改的链接列表

时间:2015-10-14 20:33:05

标签: multithreading openmp

我有一个理论上的OpenMP问题。 想象一下,我做了以下几点:

 #pragma omp parallel
 {
    #pragma omp single
    {
    while (!empty(linkedList)) {
      #pragma omp task
              doWork();
      }
    }
 }

如果doWork()将元素添加回列表会发生什么? 我担心的是,任务旋转的单个线程将在执行任务的线程完成之前终止。这可能意味着错过了由doWork函数添加回列表的任何元素。有谁知道这是如何工作的?

谢谢!

1 个答案:

答案 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));
   }
}