Абстрактно говоря, семафор - это замок с количеством разрешений, связанных с ним.Семафоры поддерживают две операции:
- Вверх , который увеличивает количество разрешений, и
- Вниз , который пытается уменьшить числоразрешений.Если недостаточно разрешений, эта операция ожидает, пока их станет достаточно.
Существует много способов реализации семафоров.Однако, как правило, семафоры не реализованы как спин-блокировки, и на самом деле ОС блокирует поток и переводит его в спящий режим, пока запрашиваемое разрешение не станет доступным.Тем не менее, совершенно легальная реализация семафора может привести его к ожиданию;Я просто не знаю ни одной реализации, которая делает это.
Переменные условия представляют другую концепцию.Как правило, семафоры предназначены для управления ресурсом, в котором существует только очень много копий.Каждый поток, который хочет ресурс, ожидает, пока семафор, защищающий доступ к нему, не станет доступным, и каждый поток, использующий ресурс, имеет одно разрешение.Условные переменные обычно используются, чтобы позволить потокам ожидать определенных событий.Обычно они поддерживают операции
- Wait , которые блокируют поток до тех пор, пока он не получит сигнал,
- Notify , который сообщает, что один поток ожидаетна условную переменную, которую он может продолжить, и
- Notify-all , который сообщает всем потокам, ожидающим на условной переменной, что они могут продолжить.
Условиепеременные и семафоры (как правило) могут использоваться взаимозаменяемо, с подходящим изменением в дизайне использования блокировки.Однако иногда с семафорами легче работать, а иногда с условными переменными легче работать, поэтому у нас есть оба примитива.Как правило, вы выбираете использовать один над другим из-за конкретной библиотеки или языка, который вы используете.Например, объекты Java имеют встроенную поддержку мониторов (условные переменные в паре с блокировкой), поэтому часто полезно использовать условные переменные в Java, хотя семафоры Java существуют.Если вы программируете в Windows, семафоры являются предпочтительным методом синхронизации, хотя условные переменные существуют.
Надеюсь, это поможет!