Я видел большинство примеров использования std::mutex
где мьютекс является глобальным. Мне было интересно, есть ли конкретная причина, почему это сделано? У меня были свои программы, где я этого не делаю, и просто передаю мьютекс как std::thread
std::ref
, Разве это не плохая практика — иметь глобальные std::mutexes
в C ++, если нет причин, ограничивающих язык, чтобы сделать это?
Плохо практиковать глобалы, кроме случаев, когда это не так. Например, std::cin
является глобальным.
Мьютексы в каком-то смысле глобальны, независимо от того, как вы делаете их доступными. Они распределяются между разрозненными частями кода. Таким образом, вы можете сделать их глобальными или передать их по цепочке вызовов с помощью функций, которые их не используют, пока в конце концов не достигнете того, кто это делает. Это известно как «данные бродяги», и это также «плохая практика». Выбери свой яд.
Скорее всего, это было сделано для облегчения подражания примеру, что позволило использовать сам мьютекс в качестве примера, а не точную специфику.
Обычно мьютекс защищает ресурс, и во многих случаях имеет смысл, чтобы мьютекс жил рядом с ресурсом. Например, если у вас есть класс с контейнером-членом, который должен быть защищен мьютексом, сделайте мьютекс также членом класса. Затем, когда экземпляр класса обрабатывается несколькими потоками, член-мьютекс может использоваться для защиты необходимого доступа к внутреннему контейнеру.