Это объявление переменной типа мьютекс: вы просто выделяете объект `pthread_mutex_t m`, но не инициализируете его — использование без инициализации приводит к неопределённому поведению. Коротко — варианты правильной инициализации и примечания: - Статическая инициализация (для объектов с длительностью хранения static/global): `pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;` - Динамическая/рутинная инициализация (например, для автоматических локальных переменных): `pthread_mutex_t m;` `pthread_mutex_init(&m, NULL);` Не забудьте при завершении: `pthread_mutex_destroy(&m);` - Если нужны нестандартные атрибуты (например, recursive), создайте `pthread_mutexattr_t` и передайте его в `pthread_mutex_init`. Примечания: - Глобальные переменные в C нулевыми будут при старте, но нуль не эквивалентен корректно инициализованному мьютексу — используйте `PTHREAD_MUTEX_INITIALIZER` или `pthread_mutex_init`. - Нельзя использовать мьютекс до инициализации; после `pthread_mutex_destroy` объект снова нельзя использовать до повторной инициализации.
Коротко — варианты правильной инициализации и примечания:
- Статическая инициализация (для объектов с длительностью хранения static/global):
`pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;`
- Динамическая/рутинная инициализация (например, для автоматических локальных переменных):
`pthread_mutex_t m;`
`pthread_mutex_init(&m, NULL);`
Не забудьте при завершении:
`pthread_mutex_destroy(&m);`
- Если нужны нестандартные атрибуты (например, recursive), создайте `pthread_mutexattr_t` и передайте его в `pthread_mutex_init`.
Примечания:
- Глобальные переменные в C нулевыми будут при старте, но нуль не эквивалентен корректно инициализованному мьютексу — используйте `PTHREAD_MUTEX_INITIALIZER` или `pthread_mutex_init`.
- Нельзя использовать мьютекс до инициализации; после `pthread_mutex_destroy` объект снова нельзя использовать до повторной инициализации.