pthread函数集是否会在内部设置errno?

4
在下面的代码中,我使用自身作为线程 ID 调用 pthread_join()。结果是返回错误号 35。因此,我尝试使用 perror 打印相同的错误信息。但是它显示“成功”。我的疑问是库/系统调用是否需要明确设置任何错误的 errno,或者我是否遗漏了什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>

#define DEATH(mess) { perror(mess); exit(errno); }

static void * threadFunc(void *arg)
{
 void *res;
 printf("sleeping for 2 sec ...\n");
 sleep(2);
 char *s = (char *) arg;
 pthread_t t = pthread_self();
 int relval = pthread_join(t, &res);

 if (relval) 
  perror("deadlock");

  printf("return value is %d .....\n",relval);
  return (void *) strlen(s);
}

int main(int argc, char *argv[])
{
 pthread_t t1;
 void *res;
 int ret;

 ret = pthread_create(&t1, NULL, threadFunc, "Hello world\n");
 if (ret != 0)
    DEATH ("pthread_create");

 printf("Message from main()\n");

 pthread_exit(&res);
 exit(EXIT_SUCCESS);

}

o/p

Message from main()
sleeping for 2 sec ...
deadlock: Success
return value is 35 .....

2
为什么你不读 man 手册呢? - Mahmoud Al-Qudsi
这不是疑问,而是一个问题。 - Jonathan Wakely
3个回答

7

这些函数没有要求设置errno,也不要求保持它不变。您可以随意执行以下操作:

errno = pthread_join(t, &res);

1
谢谢 - 这让我意识到我也可以将其与 perror 一起使用,因为(在我的系统上)pthread_joinpthread_create 可能返回的所有代码都是 perror 理解的标准代码 - EAGAINESRCH等。(基于 OS X 10.11.3,El Capitan 的手册。)虽然我不知道这是否是 pthreads 标准的一部分。 - not-just-yeti

3

2

有几件事情需要注意。

  1. 你不应该在线程内部进行连接。连接应该在父线程中完成,以清理那里的资源。
  2. errno变量是每个线程独立的变量。当你在线程内部和主函数中访问它时,它的值将不同。

还要注意的是,你无法可靠地导致 pthread_join 返回错误。它可能返回的唯一可能错误涉及到你已经调用了未定义行为,例如在线程ID的生命周期结束后使用它。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接