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是指向链表头部的指针。
答案 0 :(得分:1)
在您的代码中,您在OpenMP中使用未命名关键部分,这是全局且唯一的关键部分。因此,只有一个线程可以进入代码中关键部分的部分。要回答你的问题,是的,你不需要担心相互排斥,因为只有一个锁。
要在OpenMP中使用多个锁,请使用critical
pragma中的名称。
http://software.intel.com/en-us/articles/more-work-sharing-with-openmp/
一个例子是#pragma omp critical(maxvalue)
。
然而,很明显,拥有多个锁会增加死锁,数据竞争,锁定转发以及任何类型的并发错误的可能性。