Создание функции сбора / барьера с семафорами System V

Я пытаюсь реализовать функцию сбора, которая ожидает продолжения N процессов.

struct sembuf operations[2];

operaciones[0].sem_num = 0;
operaciones[0].sem_op = -1; // wait() or p()

operaciones[1].sem_num = 0;
operaciones[1].sem_op = 0; // wait until it becomes 0

semop ( this->id,operations,2 );

Первоначально значение семафора равно N.

Проблема в том, что он зависает, даже когда все процессы выполнили функцию semop. Я думаю, что это связано с тем, что операции выполняются атомарно (но я точно не знаю, что это значит). Но я не понимаю, почему это не работает.

Код вычитает 1 из семафора и затем блокирует процесс, если он не последний, или код должен действовать по-другому?

0

Решение

Трудно понять, что делает код без всей функции и алгоритма.
Судя по всему, вы применяете 2 действия в одном атомарном действии: вычтите 1 из семафора и дождитесь 0.
Может быть несколько проблем, если все процессы замерзнут; семафор не является общим для всех процессов, вы неправильно указали число процессов при инициации семафора, или один процесс покидает барьер, в более поздний момент семафор увеличивается и возвращается к барьеру.
Я предлагаю отладку, чтобы увидеть, что все процессы на самом деле находятся в барьере, и, возможно, даже печатать каждый раз, когда вы выполняете какие-либо действия с семафором (предпочтительно на одной консоли).

Что касается того, что такое атомное действие; это отдельная операция или последовательность операций, которая гарантированно не будет прервана во время выполнения. Это означает, что никакой другой процесс / поток не будет вмешиваться в действие.

0

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

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

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