@butnothero

Почему меняется работа RWMutex в зависимости от его расположения в коде?

Доброго времени суток. Разбирался с мьютексами и возникла проблема с ноткой недопонимания.

По задумке, в консоли должно выводится: h e l l o h e l l o ... и тд. Одна горутина считывает, другая записывает. Проблема заключается в том, что когда я использую RWMutex в Get, вывод становится рандомным, а если вне Get, то вывод правильный.

В чем причина такого поведения, и как сделать так, чтобы RWMutex/Mutex корректно работал внутри Get ?
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Wirusnyy-chel
У вас в обоих случаях mutex защищает только от одновременной записи и чтения из переменной. Фактически порядок вывода не зависит от этого мьютекса, можете убедиться в этом если запустите исполнение несколько раз или добавите разные слипы в горутинах чтения и записи.

Если необходимо синхронизировать потоки записи и чтения лучше использовать каналы.

Как упражнение на mutex могу предложить следующее:
Задать структуру с двумя переменными: где значение первой переменной зависит от второй. Если параллельно обновлять и читать значения можно увидеть следующее:
Без мьютекса чтение может иногда возвращать несогласованное значение между переменными.
С мьютексом значение при чтении будет всегда согласованным.

P.S. В вашем примере для синхронизации переменных достаточно обычного мьютекса. RWMutex будет полезен если читателей больше одного.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы