pthread_t
не является идентификатором потока или числовым индексом.Это непрозрачный тип.Создание значений может привести к сбою.
В Linux NPTL в качестве указателя используется pthread_t:
int
__pthread_kill (threadid, signo)
pthread_t threadid;
int signo;
{
struct pthread *pd = (struct pthread *) threadid;
Должно быть достаточно ясно, где что-то идет не так :) Обратите внимание, чтоэта особенность также является деталью реализации - более старая реализация Linuxthreads использовала числовые индексы в таблице, и там вы действительно могли бы составлять TID и не ожидать, что что-то рухнет.
Вы должны сами следить за жизнью и смертью потока,pthread_t
действует до тех пор, пока вы успешно не наберете pthread_join
.Если вы хотите проверить, активен ли valid pthread_t
, позвоните по номеру pthread_tryjoin_np
;если он возвращает EBUSY
, поток жив.Если функция завершается успешно, pthread_t
больше не действителен ;Вы не должны повторно использовать его на этом этапе - поэтому вы должны где-то отметить, что этот поток сейчас мертв, и нет необходимости проверять его больше!
Конечно, вы можете реализовать свое собственное отслеживаниеsystem - создать где-нибудь таблицу жизнедеятельности, систему для выдачи TID и передачи их во вновь созданные потоки.Сделайте так, чтобы каждый поток помечал себя как мертвый перед выходом (возможно, используя pthread_cleanup_push
, чтобы вы обрабатывали отмену потока и pthread_exit
), и отсоединяйте поток, чтобы вам не нужно было присоединяться к нему (используя pthread_detach
).Теперь у вас есть явный контроль над сообщениями о потере потоков.