3

ウィキペディアで例が見つかった障壁について読んでいました。それが正しいかどうかは疑問です。( 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ですか? ここで何か不足していますか?

4

1 に答える 1