Мне нужно знать, если какой-то поток уже завершен (если это не так, я должен дождаться его).
Если я назову pthread_join()
на завершаемой нити, он всегда возвращает успех в моей версии glibc. Но документация для pthread_join()
говорит, что она должна возвращать ошибку с кодом ESRCH
, если поток уже завершен.
Если я звоню pthread_kill(thread_id, 0)
, он возвращается с кодом ошибки ESRCH
(как и ожидалось).
Внутри источников glibc Я вижу, что внутри pthread_join()
существует простая проверка правильности thread_id, но не реальная проверка, существует ли поток. И внутри pthread_kill()
есть реальная проверка (в некотором списке ядра). Существует моя тестовая программа:Могу ли я использовать pthread_join() для проверки завершенного потока?
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void * thread_func(void *arg)
{
printf("Hello! I`m thread_func!\nGood-bye!\n");
return NULL;
}
int main(void)
{
int res;
pthread_t thread_id;
printf("Hello from main()!\n");
pthread_create(&thread_id, NULL, thread_func, NULL);
printf("Waiting...\n");
sleep(3);
res = pthread_join(thread_id, NULL);
printf("pthread_join() returned %d (%s)\n", res, strerror(res));
res = pthread_kill(thread_id, 0);
printf("pthread_kill() returned %d (%s)\n", res, strerror(res));
return 0;
}
Это выход:
Hello! Waiting... Hello! I`m thread_func! Good-bye! pthread_join() returned 0 (Success) pthread_kill() returned 3 (No such process)
Мой вопрос: безопасно использовать pthread_join() для проверки прерванных нитей, или я должен всегда использовать pthread_kill()?
Спасибо за ваш ответ, но мой' человек 3 pthread_join' говорит: „Соединение с резьбой, который ранее был присоединен результаты к неопределенному поведению“. – Zhenya4880
@ Zhenya4880, я не говорю, что вы должны сделать это в производственном коде, это была иллюстрация, указывающая на то, что поток не исчезнет полностью, пока вы не соберете код возврата. Если вы хотите получить сообщение об ошибке из первого соединения, отделите поток при его создании - я добавлю еще один код. – paxdiablo
Нет, спасибо. Я понял. – Zhenya4880