如何在不同的地方使用共享变量?

时间:2011-10-17 23:19:05

标签: openmp

void dequeue ()
{
     QITEM *qKill = qHead;
     .
     .
     .
      #pragma omp critical     
      qHead = qHead->qNext;
      free(qKill);       
}

void enqueue (int iNode, int iDist, int iPrev)
{
     .
     .
     .
     QITEM *qLast = qHead;

     #pragma omp critical
     {
          while (qLast->qNext) qLast = qLast->qNext;
          qLast->qNext = qNew;
     }
}

我知道如果只有一个线程可以在入队和出队时访问关键部分。

但是,如果一个线程正在访问enqueue中的临界区,而另一个线程正在以dequeue方式访问临界区,那么这段代码是否正确地保护了共享列表?

qHead是指向链表头部的指针。

1 个答案:

答案 0 :(得分:1)

在您的代码中,您在OpenMP中使用未命名关键部分,这是全局且唯一的关键部分。因此,只有一个线程可以进入代码中关键部分的部分。要回答你的问题,是的,你不需要担心相互排斥,因为只有一个锁。

要在OpenMP中使用多个锁,请使用critical pragma中的名称。

http://software.intel.com/en-us/articles/more-work-sharing-with-openmp/

一个例子是#pragma omp critical(maxvalue)

然而,很明显,拥有多个锁会增加死锁,数据竞争,锁定转发以及任何类型的并发错误的可能性。