Проблема с синхронизацией двух процессов с использованием семафоров SYSV с SEM_UNDO
У меня есть два процесса (пр. 1 и пр. 2). Я хочу запустить их по очереди (1, 2, 1, 2, ..., 1, 2). Я пытаюсь сделать это с помощью семафоров SYSV. Я создаю два семафора, полный и пустой (установите full = 0 и empty = 1). Чем я изменяю их, чтобы переключать процессы. Все в порядке, но есть проблема с окончанием (когда один из процессов завершает свою работу и умирает).
Я хочу, чтобы они подождали друг друга, поэтому используйте флаг SEM_UNDO в semop (не IPC_NOWAIT). Но если пр. 1 умирает, SEM_UNDO возвращает все значения, которые он изменил, поэтому полные и пустые получают неправильные значения (что зависит от того, сколько раз выполнялась pr. 1). Пара 2 запутывается и не работает должным образом.
Как я могу преодолеть эту проблему? Означает ли это, что используя SEM_UNDO в каком-либо процессе, мы не должны в совокупности изменять значение семафора (в противном случае мы получим описанную проблему)?