Нестатистический c локальный мьютекс по-прежнему может быть полезен: если у вас есть основной поток, который создает другие потоки и ожидает их завершения sh, мьютекс может быть локальной переменной в основном потоке, и он передаст указатель на этот мьютекс другим потокам. Это работает только в том случае, если гарантировано, что основной поток переживет другие.
Если переменная мьютекса объявлена как static
внутри вашей функции потока, она будет совместно использоваться разными потоками, которые используют эту функцию, и они могут используйте его для синхронизации. Это потому, что static
переменные имеют такое же время жизни, что и глобальные переменные (и только одна уникальная копия). Однако это работает только в том случае, если ваша библиотека потоковой передачи не требует вызова функции для инициализации мьютекса, поскольку не было бы подходящего места для этой инициализации.
Другой вариант - динамически выделить мьютекс или, что чаще всего, сделать его членом динамически выделяемой структуры. Затем вы можете передать указатель на мьютекс (или содержащую структуру) всем потокам, которые в нем нуждаются.
Что касается вашего последнего вопроса: определение глобальной переменной как static
означает, что она видна только в текущем единица перевода. Это не влияет на его время жизни, поэтому будет работать аналогично нестатическим c глобальным переменным для этого варианта использования (при условии, что вам нужно получить к нему доступ только в одном файле. c).