3

我正在检查“pthread_join”的行为并具有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>

#include <pthread.h>

void *thread(void *vargp)
{
    pthread_detach(pthread_self());
    pthread_exit((void *)42);
}

int main()
{
    int i = 1;
    pthread_t tid;

    pthread_create(&tid, NULL, thread, NULL);

    sleep(1);
    pthread_join(tid, (void **)&i);
    printf("%d\n", i);
    printf("%d\n", errno);
}

在我的平台上观察到的输出(Linux 3.2.0-32-generic #51-Ubuntu SMP x86_64 GNU/Linux):

  1. 注释掉“睡眠(1)”:42 0

  2. 使用 sleep 语句,它会产生:1 0

根据 pthread_join 的手册页,当我们尝试加入不可加入的线程时,我们应该得到错误“ EINVAL ”,但是,上述两种情况都没有设置 errno。而且在第一种情况下,似乎我们甚至可以获得分离线程的退出状态,我对结果感到困惑。谁能解释一下?谢谢

[编辑]:我意识到第一个 printf 可能会重置 'errno',但是,即使我交换了两个 'printf' 语句的顺序,我仍然得到相同的结果。

4

2 回答 2

5

你的期望是错误的。调用pthread_join分离的线程会调用未定义的行为。不需要设置errno、返回错误代码,甚至根本不需要返回。

如果您需要引用,

如果 pthread_join() 的线程参数指定的值不引用可连接线程,则行为未定义。

来源: http: //pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html

另外,请注意大多数 pthread 函数,包括pthread_join,不使用errno. 相反,它们将错误代码作为返回值返回。因此,errno在调用 pthread 函数后进行检查是错误的,即使您在调用它时没有调用未定义的行为。

于 2012-12-17T17:10:51.943 回答
0

你通过读取 function 的返回值得到这个错误pthread_join,试试这个:

if (errno = pthread_join(tid,NULL)) {
    printf("An error ocurred: %i", errno);
}
于 2012-12-17T16:39:48.440 回答