что будет, если мы подадим сигнал семафору без ожидания?

0

В моем проекте, когда я реализовывался, я столкнулся с этим сценарием. У меня есть двоичный семафор, который берется одним потоком. при выполнении этого потока семафор несколько раз сигнализируется другим потоком. Это проблема или это вызовет какое-либо неопределенное поведение?

Теги:
multithreading

2 ответа

1

Ошибочно сигнализировать семафор без соответствующего ожидания. Что произойдет, если вы это сделаете, зависит от реализации.

Если вызов ReleaseSemaphore в объекте Семафор Windows приведет к превышению максимального количества, ReleaseSemaphore вернет FALSE. Он не будет генерировать исключение или вызвать фатальную ошибку времени выполнения.

В Linux вызов sem_post, который превысит максимальное количество, возвращает -1, а errno - EOVERFLOW. Опять же, это не будет фатальным для вашего приложения.

В.NET, вызов Release, который превысит максимальное значение семафора, приводит к тому, что вызывается SemaphoreFullException.

Это логическая ошибка, чтобы освободить семафор чаще, чем он приобрел. Если ваша программа делает это, у вас есть скрытая ошибка. Это может быть хорошо в вашей конкретной ситуации, но если вы попробуете это с чем-то другим, кроме двоичного семафора, вы, скорее всего, окажетесь с очень трудными для поиска ошибками.

Я настоятельно рекомендую вам проверить возвращаемое значение при выпуске семафора и обработать сбой как фатальное исключение.

  • 0
    Спасибо за ваш ответ. Любой другой ответ, который я могу найти в Интернете, просто говорит «Вы не должны этого делать», но на самом деле не отвечает на вопрос, который возникает при изучении двух типов семафоров!
1

Бинарный семафор называется Mutex.

Ничего не произойдет, мьютекс можно взять или не взять, это только два государства. Выпуск не приобретенного мьютекса не имеет отрицательных эффектов.

Однако, учтите, что логика может быть затронута. Не похоже, что вы слишком хорошо контролируете, когда и как вы сигнализируете мьютекс, что может привести к освобождению мьютекса, который приобрел другой поток.

  • 3
    Семантика двоичного семафора и мьютекса различна.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню