вы, кажется, не проверяете , создан ли поток на самом деле или нет , другими словами, вы, кажется, не проверяете тип возврата pthread_create
и прямой вызов pthread_join
, вероятно, ведущийв Неопределенное поведение , в случае сбоя pthread_create
.
pthread_create(&producers[i], NULL, producer, (void *) &threadstruct);
из pthread_join
The pthread_join() function shall fail if:
EINVAL The implementation has detected that the value specified by thread does not refer to a joinable thread.
ESRCH No thread could be found corresponding to that specified by the given thread ID.
однако существуют случаи, когда pthread_join с ошибками сегмента дескриптора потока .
фрагмент извлечения из ссылки выше
"* Передача неверного дескриптора в pthread_join похожа на передачу неверного указателя на системный вызов.
Реализация может обнаружитьэто и сигнализирует об этом по ошибке, но это также может привести к сбою.
В Red Hat Linux есть 2 различных реализации потоков POSIX
- linuxthreads, где дескриптор pthread_t представляет собой небольшое целое число (и количество потоков существенно ограничено)
- NPTL (по умолчанию pthread_t является внутренним указателем, чтобы не было произвольных ограничений потоков)
Вы можете запросить старомодныйбиблиотека потоков с LD_ASSUME_KERNEL = 2.4.19 в среде.
Для NPTL, где pthread_t - указатель, pthread_join обнаруживает некоторые недействительные дескрипторы, где это можно сделать дешево. Но обнаружение всех возможных недействительных дескрипторов будет очень дорогостоящим (Реализация в основном должна была бы взять глобальную блокировку и перебрать все текущие запущенные потоки,позвоните ручку с каждым из них.С помощью, скажем, 100000 запущенных потоков вы можете увидеть, насколько это дорого).
Этот тестовый пример работает на SuSE, поскольку SuSE поставляется только с устаревшей немасштабируемой реализацией linuxthreads. * "
от pthead_create
RETURN VALUE
On success, pthread_create() returns 0; on error, it returns an error number, and the contents of *thread are undefined.
возможно что-то вроде этого
if( pthread_create(&producers[i], NULL, producer, (void *) &threadstruct) ) {
perror("something wrong .. ");
exit(1);
}