Избавьтесь от привычки думать, что вы защищаете функции с помощью мьютексов, вы этого не делаете.
На самом деле вы защищаете ресурсы , такие как переменные, общие для потоков.
Как только вы примете эту маленькую жемчужину мудрости, вы начнете думать о том, что данные должны быть защищены и могут минимизировать степень детализации защиты.
Например, если func1()
и func2()
оба обращаются к общей переменной x
, и вы можете вызвать func2()
либо с func1()
, либо с main()
, вам придется разработать решение, которое может определить, заблокирован ли мьютекс, такчто func2()
может требовать / освобождать (когда вызывается из main
) или ничего не делать (когда вызывается из func1()
).Либо так, либо используйте рекурсивный мьютекс.
Функции, которые не являются потокобезопасными (например, использование статических областей данных) можно защитить мьютексами, но я нахожу, что проще реорганизовать их такони изначально поточно-ориентированы (с выделенной памятью или локальным хранилищем).