Skip to content

Использование mutex.Lock() и mutex.Unlock()

Несмотря на то, что в каждой горутине значение counter сбрасывается к 0, а затем увеличивается до 5, мы видим, что несколько горутин после сброса переменной работают совсем с другим значением. То есть при запуске горутин каждая из них получает значение переменной counter и начинает с ней работать. Пока одна горутина еще не закончила работу с counter в цикле, с этой же переменной начинает работать и другая горутина. То есть к одному и тому же разделяемому общему ресурсу — переменной counter — одновременно работают сразу несколько горутин. Это может привести к некорректным результатам, как в случае, представленном в главе 5.1.

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

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

Теперь функция work принимает указатель на мьютекс. С помощью вызова mutex.Lock() мьютекс блокируется этой горутиной. Это значит, что к последующему коду имеет доступ только та горутина, которая первая заблокировала мьютекс. Остальные горутины ждут, пока мьютекс освободится.

Далее горутина сбрасывает значение переменной counter к нулю и затем в цикле последовательно увеличивает его. В конце, когда все действия с общим ресурсом уже выполнены, горутина освобождает мьютекс с помощью вызова mutex.Unlock(). Ожидающие горутины получают сигнал, что мьютекс освободился, и одна из горутин блокирует мьютекс и начинает выполнять действия с переменной counter. И далее горутины последовательно захватывают и освобождают мьютекс. В итоге к следующей секции:

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

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

С полной версией статьи ты можешь ознакомиться по ссылке.

Рекомендуем изучить дополнительные материалы по теме: