并行计算的障碍
问题描述:
我在阅读*上发现的一个例子。我怀疑这是否正确。下面是从(https://en.wikipedia.org/wiki/Barrier_(computer_science)#Implementation)并行计算的障碍
struct barrier_type
{
// how many processors have entered the barrier
// initialize to 0
int arrive_counter;
// how many processors have exited the barrier
// initialize to P
int leave_counter;
int flag;
std::mutex lock;
};
// barrier for p processors
void barrier(barrier_type* b, int p)
{
b->lock.lock();
if (b->leave_counter == P)
{
if (b->arrive_counter == 0) // no other threads in barrier
{
b->flag = 0; // first arriver clears flag
}
else
{
b->lock.unlock();
while (b->leave_counter != P); // wait for all to leave before clearing
b->lock.lock();
b->flag = 0; // first arriver clears flag
}
}
b->arrive_counter++;
int arrived = b->arrive_counter;
b->lock.unlock();
if (arrived == p) // last arriver sets flag
{
b->arrive_counter = 0;
b->leave_counter = 1;
b->flag = 1;
}
else
{
while (b->flag == 0); // wait for flag
b->lock.lock();
b->leave_counter++;
b->lock.unlock();
}
}
代码在屏障功能,在进入第一if
块之前,leave_counter
与P
比较,以检查,是否它等于P
。再次在else
块,有一个比较。
第二次比较的原因是什么,因为仅当leave_counter
的值为P
时才进入控制?我在这里错过了什么吗?
答
该互斥锁在leave_counter
的初始测试之前锁定,阻止所有其他线程。
如果调用者不是第一个通过,它会解锁互斥锁,然后在等待中旋转等待while (b->leave_counter != P)
,允许其他线程继续。
最后,b->leave_counter == P
和调用者继续。
您正在看到一个双重检查锁定模式的示例。 http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/ –
@Yadhunandana,你指的是while(b-> leave_counter!= P)测试吗? – jwdonahue
这是C或C++代码吗?它被标记为C,但使用'std :: mutex',这是C++。他们是不一样的。 –