ウィキペディアで例が見つかった障壁について読んでいました。それが正しいかどうかは疑問です。( 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
値がの場合にのみコントロールに入るので、2 番目の比較の理由は何P
ですか? ここで何か不足していますか?