Во-первых, всегда проверяйте возвращаемые значения вызовов вашей функции.Если вызов pthread завершится неудачно, будет хорошим выбором просто вызвать abort()
, который выполнит дамп памяти, если он у вас включен, или перейдет в отладчик, если вы работаете с ним.
Вызов функции pthread действительно долженникогда не ошибайтесь, а это значит, что с вашей программой что-то не так.В программах на C или C ++ то, что обычно вызывает таинственные сбои, - это повреждение памяти.Для проверки используйте valgrind в его обычных режимах.
Еще одна вещь, которая может вызвать сбой вызовов pthread, - это не компилировать с использованием -pthread
.Если вы используете GCC, вы должны скомпилировать и связать, используя gcc, с помощью команды типа gcc -pthread
.Это свяжет библиотеку pthread и установит некоторые определения препроцессора, которые могут быть важны для заголовочных файлов вашей системы.
Некоторые системы будут успешно компилировать и связывать программу, использующую вызовы pthread, без привязки ее к библиотекам pthread,Это сделано для того, чтобы программа или библиотека могли быть поточно-ориентированными без фактического использования потоков.Вызовы потоков будут связаны с фиктивными функциями, если не связана реальная библиотека pthread.Это может привести к сбою некоторых вызовов функций.
Поэтому убедитесь, что вы строите с правильными опциями компилятора для включения библиотек pthread.
Другая возможная причина - если вы строите на некотором сбитомиз полу-гибридной ОС, где она начиналась как Linux 2.4 и в какой-то момент была обновлена до Linux 2.6 NPTL (однажды я работал над чем-то вроде этого).Если вы пытаетесь скомпилировать старые файлы заголовков с устаревшим определением PTHREAD_MUTEX_INITIALIZER
или неправильным размером для типа pthread_mutex_t
, это может вызвать проблему.