Skip to content

Использование каналов в качестве блокировки мьютекса или счетных семафоров

Использование каналов в качестве блокировки мьютекса

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

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

  1. Блокировка через отправку, разблокировка через получение.

  2. Блокировка через получение, разблокировка через отправку.

Ниже приведен пример блокировки сквозной отправки.

Пришло время поработать с кодом!

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

Использование каналов в качестве счетных семафоров

Буферизованные каналы могут использоваться как счетные семафоры. Счетные семафоры можно рассматривать как блокировки с несколькими владельцами. Если пропускная способность канала равна N, то его можно рассматривать как замок, который может иметь большинство N владельцев в любое время. Бинарные семафоры (мьютексы) — это специальные счетные семафоры, каждый из бинарных семафоров в любой момент времени может иметь не более одного владельца. О мьютексах мы подробнее узнаем в теме 5.

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

Как и при использовании каналов в качестве мьютексов, существует два способа получения права собственности на семафор канала:

  1. Получи право собственности через отправку, освободи через получение.

  2. Получи право собственности через получение, освободичерез отправку.

Пример приобретения права собственности через получение значений из канала.

Пришло время поработать с кодом!

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

Последний for цикл в main функции предотвращает выход из программы. Существует лучший способ для выполнения этой работы, который будет представлен lfktt.

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

Пришло время поработать с кодом!

В приведенной выше оптимизированной версии будет сосуществовать не более десяти активных клиентских горутин, но все еще будет много клиентских горутин, созданных за время существования программы.

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

Пришло время поработать с кодом!

Оффтоп: конечно, если нас не волнуют идентификаторы мест, что распространено на практике, то bar24x7 семафор вообще не важен.

Пришло время поработать с кодом!

Способ получения права собственности на семафор посредством отправки сравнительно проще. Этап расстановки сидений не нужен.

Пришло время поработать с кодом!