2016-10-28 2 views
1

В Semaphore vs. Monitors - what's the difference?,Что это означает: «Поток, который выпускает семафор, не обязательно должен быть тем же самым потоком, который его приобрел»?

Нить, освобождает семафор не обязательно должен быть тот же поток, что приобрел его.

Если нить не приобрела семафор, то как поток может освободить семафор?

Семафор здесь означает семафор, реализованный с оживленным ожиданием или реализованный с блокировкой процесса?

Спасибо.

ответ

1

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

Реализация семафоров с оживленным оживлением будет абсолютно ужасной. В отличие от замков, существуют ситуации, когда семафоры удерживаются в течение длительного времени (секунды или минуты, часы будут немного необычными, но абсолютно возможны).

Очевидно, что ссылка на объект семафора должна храниться в месте, где другой поток может получить к нему доступ.

2

Семафор охватывает различные варианты использования, кроме мьютекса.

С мьютексом вы были бы правы. Мьютекс обычно используется для предотвращения одновременного выполнения критических разделов в коде. Конкретный поток получит мьютекс в начале критического раздела и освободит его, когда он снова покинет критический раздел. Наличие мьютекса, выделяемого другим потоком, чем тот, который его приобрел, будет означать, что критический раздел связан с несколькими потоками, что, скорее всего, не так, как вы хотите что-то делать.

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

Теперь, когда сценарий, в котором мы говорим о фиксированном наборе ресурсов (например, набор доступных портов ввода-вывода), имеет смысл также для того, чтобы поток-прилив снова выпустил ресурс. Я приобретаю порт, выполняю некоторую работу и освобождаю его, когда делаю так, чтобы другие потоки могли работать над ним.

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