суббота, 9 февраля 2019 г.

Go FAQ: Почему операции с map (картой) не определены как атомарные?

После долгого обсуждения среди создателей Go было решено, что типичное использование карт не требует безопасного доступа из нескольких go-процедур (goroutines), и в тех случаях, когда это произошло, карта была вероятно, частью какой-то более крупной структуры данных или вычислений, которые уже были синхронизированы. Поэтому требование, чтобы все операции на карте захватывали мьютекс, замедляло бы отключение большинства программ, при этом добавило безопасности лишь немногим. Это было нелегкое решение, однако, поскольку такое решение принято, это означает, что неконтролируемый доступ к карте может привести к сбою программы.

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

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

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


Читайте также:


Комментариев нет:

Отправить комментарий