Синхронизация семафоров по значению 0

Используя семафоры SysV в ОС UNIX, можно реализовать алгоритм, в котором процесс ожидает, пока значение семафора не достигнет значения 0 (подробности см. В man semop). Теперь, кажется, все говорят, что лучше использовать другие API синхронизации, и поэтому у меня вопрос: как я могу добиться того же поведения, используя pthreads, семафоры POSIX или другие подобные API? Если это невозможно, стоит ли мне беспокоиться об использовании семафоров SysV?

РЕДАКТИРОВАТЬ: я имею в виду многопоточный сценарий, потоки создаются с использованием pthreads.


person Raffo    schedule 28.07.2011    source источник


Ответы (1)


Семафоры Sysv отлично подходят для синхронизации нескольких процессов. В заменителе нет капли.

Если у вас один процесс и вы используете потоки, то семафоры sysv имеют большие накладные расходы и потребляют глобальные системные ресурсы, когда вам это не нужно. Я бы просто использовал семафоры POSIX.

person Yann Ramin    schedule 28.07.2011
comment
Отредактировал вопрос. Я нахожусь в многопоточном сценарии. Я могу использовать семафоры posix, но я не вижу очевидного способа получить синхронизацию по значению 0 семафора, как описано в вопросе. - person Raffo; 28.07.2011
comment
@Rafflo: вы пытаетесь имитировать барьер, а не семафор? То есть все ожидающие ресурсы готовы к запуску, когда барьер достигает 0. - person Yann Ramin; 28.07.2011
comment
Да, наверное, того же можно добиться с помощью шлагбаума. Однако в настоящее время я использую OSX, где в pthread нет реализации барьера памяти. Еще одна вещь, на которую следует обратить внимание, - это то, что я не знаю, какое значение будет достигать семафор ... Я просто хочу, чтобы поток остановился, пока он не станет отличным от 0. - person Raffo; 28.07.2011