2015-08-24 6 views
2

Я реализую семафор на языке c. У меня есть семафор подсчета POSIX. Я хочу присвоить ему значение. и я не хочу использовать Wait или Post. Я могу это сделать? Есть ли какая-либо функция типа setValue для POSIX Semaphore?Как установить значение семафора POSIX в 1?

+1

['sem_init (3)'] (http://linux.die.net/man/3/sem_init) –

+0

@ FilipeGonçalves: Вызов 'sem_init' на уже инициализированный семафор приводит к неопределенному поведению. Вы можете сначала уничтожить его, но если одновременные сообщения или ожидания возможны, когда вы его уничтожаете, это также приводит к неопределенному поведению. В основном то, что просит ОП, просто безнадежно неправильно. –

ответ

1

Wait and Post - это единственные операции, поддерживаемые классическим семафором. Семафоры POSIX могут быть инициализированы с помощью count с помощью sem_init(). Любая функция 'setValue' разрушает функциональность семафора, позволяя единицам «потеряться», например. будучи отправлен одним потоком перед тем, как «setValue» был вызван другим.

Это действительно плохая идея, поэтому она не реализована.

3

Если вы можете изменить свое значение при нормальной работе (то есть, за исключением инициализации), это не будет семафором. Таким образом, вы можете искать что-то другое, возможно, потокобезопасную счетчик/общую переменную? Такие более сложные общие объекты обычно реализуются с помощью основных примитивов синхронизации, таких как locks/mutex/semaphore/etc. Что использовать зависит от того, что вы хотите реализовать.

OTOH, вы, возможно, представляете XY-problem. Возможно, если вы укажете, чего вы на самом деле хотите достичь, мы можем указать вам на лучшее/более простое решение.

Смежные вопросы