并行计算的障碍

问题描述:

我在阅读*上发现的一个例子。我怀疑这是否正确。下面是从(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_counterP比较,以检查,是否它等于P。再次在else块,有一个比较。

第二次比较的原因是什么,因为仅当leave_counter的值为P时才进入控制?我在这里错过了什么吗?

+0

您正在看到一个双重检查锁定模式的示例。 http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/ –

+0

@Yadhunandana,你指的是while(b-> leave_counter!= P)测试吗? – jwdonahue

+0

这是C或C++代码吗?它被标记为C,但使用'std :: mutex',这是C++。他们是不一样的。 –

该互斥锁在leave_counter的初始测试之前锁定,阻止所有其他线程。

如果调用者不是第一个通过,它会解锁互斥锁,然后在等待中旋转等待
while (b->leave_counter != P),允许其他线程继续。
最后,b->leave_counter == P和调用者继续。