В моем проекте, когда я реализовывался, я столкнулся с этим сценарием. У меня есть двоичный семафор, который берется одним потоком. при выполнении этого потока семафор несколько раз сигнализируется другим потоком. Это проблема или это вызовет какое-либо неопределенное поведение?
Ошибочно сигнализировать семафор без соответствующего ожидания. Что произойдет, если вы это сделаете, зависит от реализации.
Если вызов ReleaseSemaphore в объекте Семафор Windows приведет к превышению максимального количества, ReleaseSemaphore
вернет FALSE
. Он не будет генерировать исключение или вызвать фатальную ошибку времени выполнения.
В Linux вызов sem_post, который превысит максимальное количество, возвращает -1, а errno
- EOVERFLOW
. Опять же, это не будет фатальным для вашего приложения.
В.NET, вызов Release, который превысит максимальное значение семафора, приводит к тому, что вызывается SemaphoreFullException
.
Это логическая ошибка, чтобы освободить семафор чаще, чем он приобрел. Если ваша программа делает это, у вас есть скрытая ошибка. Это может быть хорошо в вашей конкретной ситуации, но если вы попробуете это с чем-то другим, кроме двоичного семафора, вы, скорее всего, окажетесь с очень трудными для поиска ошибками.
Я настоятельно рекомендую вам проверить возвращаемое значение при выпуске семафора и обработать сбой как фатальное исключение.
Бинарный семафор называется Mutex.
Ничего не произойдет, мьютекс можно взять или не взять, это только два государства. Выпуск не приобретенного мьютекса не имеет отрицательных эффектов.
Однако, учтите, что логика может быть затронута. Не похоже, что вы слишком хорошо контролируете, когда и как вы сигнализируете мьютекс, что может привести к освобождению мьютекса, который приобрел другой поток.