2

下面是期望程序陷入死锁的程序,因为 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
4

1 回答 1

3

你不能加入你自己。POSIX 手册页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
}
于 2014-06-07T07:27:56.230 回答