gpt4 book ai didi

c - pthread : join a detached thread doesn't set errno correctly

转载 作者:太空狗 更新时间:2023-10-29 16:13:21 25 4
gpt4 key购买 nike

我正在检查“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. 注释掉“sleep(1)”:420

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

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

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

最佳答案

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

如果您需要引用,

The behavior is undefined if the value specified by the thread argument to pthread_join() does not refer to a joinable thread.

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

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

关于c - pthread : join a detached thread doesn't set errno correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13917944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com