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

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

6

Решение

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

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

5

Другие решения

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

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

0

По вопросам рекламы [email protected]