Есть ли какая-либо причина, по которой C++ 11+ std::mutex следует объявлять как глобальную переменную, а не передавать в std::thread в качестве параметра функции?

Я видел большинство примеров использования std::mutex где мьютекс является глобальным. Мне было интересно, есть ли конкретная причина, почему это сделано? У меня были свои программы, где я этого не делаю, и просто передаю мьютекс как std::threadstd::ref, Разве это не плохая практика - иметь глобальные std::mutexes в C++, если нет причин, ограничивающих язык, чтобы сделать это?

2 ответа

Плохо практиковать глобалы, кроме случаев, когда это не так. Например, std::cin является глобальным.

Мьютексы в каком-то смысле глобальны, независимо от того, как вы делаете их доступными. Они распределяются между разрозненными частями кода. Таким образом, вы можете сделать их глобальными или передать их по цепочке вызовов с помощью функций, которые их не используют, пока вы в конечном итоге не достигнете того, кто это делает. Это известно как "данные бродяги", и это также "плохая практика". Выбери свой яд.

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

Обычно мьютекс защищает ресурс, и во многих случаях имеет смысл, чтобы мьютекс жил рядом с ресурсом. Например, если у вас есть класс с контейнером-членом, который должен быть защищен мьютексом, сделайте мьютекс также членом класса. Затем, когда экземпляр класса обрабатывается несколькими потоками, член-мьютекс может использоваться для защиты необходимого доступа к внутреннему контейнеру.

Другие вопросы по тегам