Golang простыми словами — блокировка мьютекса (sync.Mutex) и блокировка чтения-записи (sync.RWMutex)
Golang простыми словами — блокировка мьютекса (sync.Mutex) и блокировка чтения-записи (sync.RWMutex)

В параллельном программировании на языке Go блокировка мьютекса(sync.Mutex)иблокировка чтения-записи(sync.RWMutex)Это достижение потокобезопасности、Основные инструменты для защиты общих ресурсов от гонок。В этой статье в простой и понятной форме будут проанализированы характеристики и использование этих двух замков.,Обсудить распространенные проблемы, распространенные ошибки и решения,И углубите свое понимание с помощью примеров кода.

Блокировка мьютекса (sync.Mutex)

блокировка мьютекса,Как следует из названия,Убедитесь, что одновременно есть только одинgoroutineВозможность доступа к защищенным ресурсам。существоватьGoсередина,sync.MutexТип обеспечивает блокировку(Lock())и разблокировать(Unlock())методдля достижения взаимоисключающего доступа。

Язык кода:javascript
копировать
var mu sync.Mutex
var sharedResource int

func increment() {
    mu.Lock()
    sharedResource++
    mu.Unlock()
}

func decrement() {
    mu.Lock()
    sharedResource--
    mu.Unlock()
}

Часто задаваемые вопросы и ошибки

Проблема 1: забыл разблокировать

Забыл позвонитьUnlock()методприведет к другимgoroutineзаблокирован навсегда,тупик。Обязательно убедитесь, что каждыйLock()Все имеют соответствующиеUnlock()

Язык кода:javascript
копировать
gomu.Lock()
// ... сложная логика ...
// Если ты забудешь здесь Unlock()

Решение:следовать“замок-Исправлять-Разблокировать”режим,убеждатьсясуществоватькаждый разLock()назад Все имеют соответствующиеUnlock()。использоватьdefer语句可以убеждаться Разблокироватьдействоватьсуществовать Автоматически выполняется перед возвратом функции,Не забудьте разблокировать:

Язык кода:javascript
копировать
func increment() {
    mu.Lock()
    defer mu.Unlock()
    sharedResource++
}
Проблема 2: Повторная разблокировка

Звонил несколько разUnlock()может привести к гонкам данных илиpanic。каждыйLock()может быть только Разблокироватьодин раз。

Язык кода:javascript
копировать
mu.Lock()
sharedResource++
mu.Unlock()
mu.Unlock() // ошибка:Разблокировать повторно

Решение:убеждатьсякаждыйLock()Существует только один соответствующийUnlock()。использоватьdeferможно избежать таких проблем。

Блокировка чтения-записи (sync.RWMutex)

блокировка чтения-записисуществоватьблокировка мьютекса Добавлена ​​оптимизация операций чтения на основе。Это позволяет любому количеству читателей(RLock())Доступ к ресурсам одновременно,Но писатель(Lock())По-прежнему иметь эксклюзивный доступ。sync.RWMutexпредоставилRLock()RUnlock()Lock()иUnlock()метод。

Язык кода:javascript
копировать
var rwmu sync.RWMutex
var sharedResource string

func reader() {
    rwmu.RLock()
    fmt.Println(sharedResource)
    rwmu.RUnlock()
}

func writer(newValue string) {
    rwmu.Lock()
    sharedResource = newValue
    rwmu.Unlock()
}

Часто задаваемые вопросы и ошибки

Вопрос 1. Обновление и понижение версии блокировок чтения и записи.

sync.RWMutexПрямое обновление с блокировки чтения на блокировку записи или переход с блокировки записи на блокировку чтения не поддерживается.。Попытка сделать это может привести к взаимоблокировке или гонке данных.。

Язык кода:javascript
копировать
rwmu.RLock()
// Ошибка: невозможно напрямую перейти с блокировки чтения на блокировку записи.
rwmu.Lock()

Решение:Если вам нужно обновить или понизить версию,Существующие блокировки должны быть сначала сняты.,Тогда приобретите новый тип замка. Обратите внимание, что между освобождением старой блокировки и получением новой блокировки может возникнуть состояние гонки.,Требуется правильная синхронизация.

Проблема 2: путаница в блокировках чтения-записи и блокировках мьютексов.

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

Язык кода:javascript
копировать
var sharedResource int
var mu sync.Mutex // следует использовать sync.RWMutex

func reader() {
    mu.RLock() // ошибка:блокировка мьютекса Нет RLock метод
    fmt.Println(sharedResource)
    mu.RUnlock()
}

Решение:По режиму доступа к ресурсу(Больше чтения и меньше письма или сбалансированное чтение и письмо.)Выберите правильный тип замка。Для частого чтения、Иногда написанные сцены,Приоритет отдается использованию блокировки чтения-записи.

Заключение

Понимание и правильное использование блокировки мьютекса(sync.Mutex)иблокировка чтения-записи(sync.RWMutex)Безопасно ли писать параллелизмGoОсновы программы。Имейте в виду следующие моменты:

  • блокировка мьютексаУбедитесь, что одновременно есть только одинgoroutineдоступ к ресурсам,Подходит для сценариев с большим количеством письма или сбалансированным чтением и письмом.
  • блокировка чтения-записиОптимизированные операции чтения,Разрешить нескольким читателям доступ к ресурсам одновременно,Подходит для сценариев, где много читают и мало пишут.
  • Не забывайте разблокировать、Разблокировать повторно、Запутатьблокировка чтения-записииблокировка мьютекса и пытаюсь обновить или понизить версию замка.
  • использоватьdefer语句убеждаться Разблокироватьдействовать的正确执行,Улучшите читаемость и надежность кода.

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

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024. Приходите и разделите со мной приз!

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.