下面是程序进入死锁状态的程序,因为pthread_join()是线程上的阻塞等待(等待终止)。
但我发现pthread_join()不会阻塞并返回失败(35)
你能帮我理解为什么pthread_join()取消阻止?因为主线程还没有终止,可能这应该是一个死锁?
#include <pthread.h>
int
main(int argc, char *argv[])
{
void *res;
int s;
printf("Message from main()\n");
s = pthread_join(pthread_self(), &res);
if (s != 0)
printf("pthread_join(): %d",s);
printf("Thread returned %d\n", (int) res);
exit(0);
}
这是输出:
Message from main()
pthread_join(): 35
Thread returned 134514009
答案 0 :(得分:2)
你不能加入自己。 POSIX manpage for pthread_join
指定您可能会遇到死锁错误:
[EDEADLK]
A deadlock was detected or the value of thread specifies the calling thread.
事实上,对该错误的搜索显示它是35
,至少在我的系统上是这样的:
pax> cd /usr/include
pax> grep EDEADLK *.h */*.h */*/*.h
asm-generic/errno.h:#define EDEADLK 35 /* Resource deadlock would occur */
虽然某些死锁对于pthreads自动检测来说是微妙且困难的,但这个死点相对容易,在join函数的开头就是这样的:
int pthread_join(pthread_t thread, void **value_ptr) {
if (thread == pthread_self())
return EDEADLK;
// rest of function
}