配置threadsafe errno的检查

时间:2017-08-01 11:00:38

标签: c errno

我们的软件中有一个问题报告,结果是由非线程安全引起的 - errno(感谢Solaris上稍微错误的编译器标记)。

我想添加一个配置检查,以确保这种虚假的操作模式不会再次重新进入。

我从一些相当幼稚的东西开始:

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>

void* thread1_func(void*)
{
    errno = 1;
    return 0;
}

int
main ()
{
    errno = 0;
    pthread_t t1;
    pthread_create(&t1, NULL, thread1_func, NULL);
    pthread_join(t1, NULL);
    return errno;
}

这在大多数平台上运行良好,除了在return errno生成2的OpenBSD上 - 即使pthread_create / pthread_join不触及errno。 (有趣的是,如果我在printf之前插入pthread_create调用,这就会消失,这使得调试变得非常困难。

我怀疑以这种方式访问​​errno在技术上是未定义的。

如何检查errno是否为线程安全?

1 个答案:

答案 0 :(得分:0)

此代码:

#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>

void* thread1_func(void*)
{
    errno = 1;
    return 0;
}

int
main ()
{
    errno = 0;
    pthread_t t1;
    pthread_create(&t1, NULL, thread1_func, NULL);
    pthread_join(t1, NULL);
    return errno;
}

不是errno值或用法的有效测试。每the C standard 7.5错误&lt; errno.h&gt; ,第3段:

  

... errno的值可能会被库设置为非零值   函数调用是否有错误,提供了   errno的使用未记录在描述中   本国际标准中的功能

换句话说,如果C标准没有明确表示它不能,即使没有错误,任何函数都可以自由修改errno的值。

errno仅在记录为使用errno的库函数调用返回错误后立即生效。