Барьер - это конструкция синхронизации, в которой набор процессов синхронизируется глобально, то есть каждый процесс в наборе достигает барьера и ожидает прибытия всех остальных, а затем все процессы покидают барьер. Пусть количество процессов в наборе равно трем и S будет двоичным семафором с обычными функциями P и V. Рассмотрим следующую реализацию барьера на языке C с номерами строк, показанными слева.
void barrier (void) {
1: P(S);
2: process_arrived++;
3: V(S);
4: while (process_arrived !=3);
5: P(S);
6: process_left++;
7: if (process_left==3)
{
8: process_arrived = 0;
9: process_left = 0;
10: }
11: V(S);
}
Переменные process_arhibited и process_left используются всеми процессами и инициализируются нулем. В параллельной программе все три процесса вызывают барьерную функцию, когда им требуется глобальная синхронизация.
Будет ли работать вышеуказанная реализация? Я думаю, что это может привести к тупиковой ситуации, если два вызова барьера используются в непосредственной последовательности, поскольку первый процесс для входа в барьер не ждет, пока process_arhibited станет нулем, прежде чем приступить к выполнению P (S).