在errno.h
中,这个变量被声明为extern int errno;
,所以我的问题是,在一些调用之后检查perror值或在多线程代码中使用errno
()是否安全。这是一个线程安全变量吗?如果不是,那么还有什么选择呢?
我和gcc在x86架构上使用linux。
发布于 2009-11-08 03:51:26
这是来自我的苹果电脑上的<sys/errno.h>
:
#include <sys/cdefs.h>
__BEGIN_DECLS
extern int * __error(void);
#define errno (*__error())
__END_DECLS
因此,errno
现在是一个函数__error()
。该函数的实现是线程安全的。
发布于 2009-11-08 03:48:37
在许多Unix系统上,使用-D_REENTRANT
编译可确保errno
是线程安全的。
例如:
#if defined(_REENTRANT) || _POSIX_C_SOURCE - 0 >= 199506L
extern int *___errno();
#define errno (*(___errno()))
#else
extern int errno;
/* ANSI C++ requires that errno be a macro */
#if __cplusplus >= 199711L
#define errno errno
#endif
#endif /* defined(_REENTRANT) */
发布于 2018-09-15 19:21:38
我们可以通过在机器上运行一个简单的程序来检查。
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#define NTHREADS 5
void *thread_function(void *);
int
main()
{
pthread_t thread_id[NTHREADS];
int i, j;
for(i=0; i < NTHREADS; i++)
{
pthread_create( &thread_id[i], NULL, thread_function, NULL );
}
for(j=0; j < NTHREADS; j++)
{
pthread_join( thread_id[j], NULL);
}
return 0;
}
void *thread_function(void *dummyPtr)
{
printf("Thread number %ld addr(errno):%p\n", pthread_self(), &errno);
}
运行此程序,您可以在每个线程中看到errno的不同地址。在我的机器上运行的输出如下所示:
Thread number 140672336922368 addr(errno):0x7ff0d4ac0698
Thread number 140672345315072 addr(errno):0x7ff0d52c1698
Thread number 140672328529664 addr(errno):0x7ff0d42bf698
Thread number 140672320136960 addr(errno):0x7ff0d3abe698
Thread number 140672311744256 addr(errno):0x7ff0d32bd698
请注意,所有线程的地址都是不同的。
https://stackoverflow.com/questions/1694164
复制相似问题