Барьеры в параллельных вычислениях

Я читал о барьерах, нашел пример в Википедии. Я сомневаюсь, что это правильно. Вот код от ( 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? Я что-то здесь упускаю?

3

Решение

Мьютекс заблокирован перед начальным тестом leave_counter, блокируя все остальные темы.

Если вызывающий абонент не первый, кто пропускает вызов, он разблокирует мьютекс, а затем ожидает ожидания в
while ( b->leave_counter != P ), позволяя другим потокам продолжить.
В конце концов, b->leave_counter == P и звонящий продолжает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]