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