Я реализую семафор на языке c. У меня есть семафор подсчета POSIX. Я хочу присвоить ему значение. и я не хочу использовать Wait или Post. Я могу это сделать? Есть ли какая-либо функция типа setValue для POSIX Semaphore?Как установить значение семафора POSIX в 1?
ответ
Wait and Post - это единственные операции, поддерживаемые классическим семафором. Семафоры POSIX могут быть инициализированы с помощью count с помощью sem_init(). Любая функция 'setValue' разрушает функциональность семафора, позволяя единицам «потеряться», например. будучи отправлен одним потоком перед тем, как «setValue» был вызван другим.
Это действительно плохая идея, поэтому она не реализована.
Если вы можете изменить свое значение при нормальной работе (то есть, за исключением инициализации), это не будет семафором. Таким образом, вы можете искать что-то другое, возможно, потокобезопасную счетчик/общую переменную? Такие более сложные общие объекты обычно реализуются с помощью основных примитивов синхронизации, таких как locks/mutex/semaphore/etc. Что использовать зависит от того, что вы хотите реализовать.
OTOH, вы, возможно, представляете XY-problem. Возможно, если вы укажете, чего вы на самом деле хотите достичь, мы можем указать вам на лучшее/более простое решение.
['sem_init (3)'] (http://linux.die.net/man/3/sem_init) –
@ FilipeGonçalves: Вызов 'sem_init' на уже инициализированный семафор приводит к неопределенному поведению. Вы можете сначала уничтожить его, но если одновременные сообщения или ожидания возможны, когда вы его уничтожаете, это также приводит к неопределенному поведению. В основном то, что просит ОП, просто безнадежно неправильно. –