Разблокировка всех процессов, ожидающих семафор - PullRequest
0 голосов
/ 02 июня 2018

У меня есть программа, которой требуется несколько процессов для доступа к общему ресурсу.Этот общий ресурс не существует, когда они все запускаются, поэтому один из них должен его создать.После создания общего ресурса важная инфраструктура устанавливается для последующего использования.Однако существует вероятность, что, если процесс «создателя» запланирован за до , он может установить инфраструктуру в общем ресурсе, что другие процессы попытаются использовать неинициализированные данные (что приведет к неопределенному поведению).,

Чтобы контролировать это, я создал с именем семафор (sem_t *sem_init).Любой процесс, который не является создателем, «сбрасывает» или «ждет» в этом инициализированном нулем семафоре.Когда процесс создателя завершил настройку, он "вверх" или "отправляет" семафор, освобождая процессы.Однако остается одна проблема. Я не знаю точно, сколько процессов ожидает на нем .


Для решения этой проблемы у меня есть следующие варианты:

  1. Я создаю счетный семафор .Каждый процесс "вверх" или "сообщения" в этом семафоре перед блокировкой в ​​семафоре инициализации.Таким образом, я могу знать, сколько процессов выпустить.

  2. Я просто "размещаю" на семафоре инициализации, пока не достигну максимально допустимого значения.


Мне не нравятся эти "решения".Во-первых, я ограничен максимальным размером семафора, когда речь идет о количестве процессов, которые я могу сосчитать.Также кажется, что «публикация» так много раз повлечет за собой неприятные накладные расходы.Тогда у меня возникает вопрос: можно ли каким-либо образом поручить семафору выпустить всех заблокированных процессов, без какой-либо явной бухгалтерии с моей стороны?Я также не хотел бы ограничиваться максимальным значением семафора.

Что-то вроде: sem_releaseAll (sem_t *sem_p); было бы идеально.

Примечание: Я бы предпочел решение на базе Linux.

...