Используйте семафор POSIX вместо 1
. (см. Ниже). Используйте sem_init
для неназванных семафоров или sem_open
для именованных.
sem_t sem;
/* initialize using sem_init or sem_open */
sem_wait(&sem);
/* critical region */
sem_post(&sem);
Через много лет после первоначальной публикации этого ответа его необходимо обновить.
На самом деле вместо семафоров должны использоваться мьютексы .Комментарии Р. и Куги (дословно скопированные ниже) объясняют почему.В частности, я нахожу упоминание Куги о том, что мьютексы могут быть post
редактируемыми только их наиболее привлекательным потоком блокировки.
R
sem_init требует ненулевого pshared аргумента для совместного использованияТочно так же, как мьютексу потребуется атрибут pshared.Для этого нет причин предпочитать семафоры мьютексам, и на самом деле мьютексы были бы лучше, потому что вы могли бы использовать надежный мьютекс, который позволяет вам обрабатывать (очень реальный!) Случай, когда один процесс умирает, удерживая блокировку.
kuga
Помимо сообщения R... мьютекс может быть опубликован только тем, кто его блокирует.Это часто требуется, и семафор не предоставляет эту функцию.Так что это не правильный ответ, ответ Джеффа должен быть помечен как правильный ответ.