Весь смысл использования мьютекса состоит в том, чтобы предотвратить потоки B, C, D и т. Д. c. от просмотра общих данных в несогласованном состоянии из-за изменений, внесенных потоком A.
Вы предложили следующее:
void Thread1() {
std::unique_lock<std::mutex> ul(mutex);
func1(); // map object is getting changed here
func2(); // map object is getting changed here
}
Отходит ли func1()
карта (и, возможно, другие общие переменные) в состояние, которое не должны видеть другие темы? и func2()
делает ли это снова ОК для других потоков, чтобы увидеть общие данные? Если это так, то ваш пример, вероятно, - лучшее, на что вы можете надеяться. Но если каждый из этих двух вызовов функций оставляет общие данные в «безопасном» состоянии, то вы можете рассмотреть возможность блокировки каждого из них по отдельности и разблокирования mutex
.
Обычно вам лучше если потоки могут быть спроектированы так, чтобы им не часто требовался для доступа к общим данным, а когда им нужно нужен доступ к ним, они входили и выходили (т.е. блокировали и разблокировали ) как можно быстрее.
См. также, блокировка писателя читателя (на C ++, std::shared_lock
) в случае, если случается, чтобы помочь с вашей конкретной проблемой.