我们的软件中有一个问题报告,结果是由非线程安全引起的 - 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
是否为线程安全?
答案 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
的库函数调用返回错误后立即生效。