【发布时间】:2015-06-02 22:28:07
【问题描述】:
我需要知道某个线程是否已经终止(如果没有,我必须等待它)。
如果我在终止的线程上调用pthread_join(),它总是在我的 glibc 版本中返回成功。
但是pthread_join() 的文档说如果线程已经终止,它必须返回带有代码ESRCH 的错误。
如果我调用pthread_kill(thread_id, 0),它会返回错误代码ESRCH(如预期的那样)。
在 glibc 源代码中,我看到在 pthread_join() 中可以简单地检查有效的 thread_id,但不能真正检查线程是否存在。
在pthread_kill() 内部有真正的检查(在某些内核列表中)。
有我的测试程序:
#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;
}
它的输出:
你好! 等待... 你好!我是线程函数! 再见! pthread_join() 返回 0(成功) pthread_kill() 返回 3(没有这样的进程)我的问题:使用 pthread_join() 检查终止的线程是否安全,或者我必须始终使用 pthread_kill()?
【问题讨论】:
标签: pthreads