Почему меняется работа RWMutex в зависимости от его расположения в коде?
Доброго времени суток. Разбирался с мьютексами и возникла проблема с ноткой недопонимания.
По задумке, в консоли должно выводится: h e l l o h e l l o ... и тд. Одна горутина считывает, другая записывает. Проблема заключается в том, что когда я использую RWMutex в Get, вывод становится рандомным, а если вне Get, то вывод правильный.
В чем причина такого поведения, и как сделать так, чтобы RWMutex/Mutex корректно работал внутри Get ?
У вас в обоих случаях mutex защищает только от одновременной записи и чтения из переменной. Фактически порядок вывода не зависит от этого мьютекса, можете убедиться в этом если запустите исполнение несколько раз или добавите разные слипы в горутинах чтения и записи.
Если необходимо синхронизировать потоки записи и чтения лучше использовать каналы.
Как упражнение на mutex могу предложить следующее:
Задать структуру с двумя переменными: где значение первой переменной зависит от второй. Если параллельно обновлять и читать значения можно увидеть следующее:
Без мьютекса чтение может иногда возвращать несогласованное значение между переменными.
С мьютексом значение при чтении будет всегда согласованным.
P.S. В вашем примере для синхронизации переменных достаточно обычного мьютекса. RWMutex будет полезен если читателей больше одного.
Спасибо за ответ, но сколько бы я не запускал решение с "правильным выводом" у меня всегда сохраняется порядок вывода (запускал раз 40 на своем компе + раз 20 в go playground). Мб все-таки есть разница где вызывать мьютекс на чтение?
P.S. Если заюзать обычный мьютекс, то вывод в обоих решениях всегда будет неправильным (в 1-м случае также рандом, а во 2-м символы дублируются по множеству раз).