首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >errno是线程安全的吗?

errno是线程安全的吗?
EN

Stack Overflow用户
提问于 2009-11-08 03:39:54
回答 4查看 49.1K关注 0票数 196

errno.h中,这个变量被声明为extern int errno;,所以我的问题是,在一些调用之后检查perror值或在多线程代码中使用errno ()是否安全。这是一个线程安全变量吗?如果不是,那么还有什么选择呢?

我和gcc在x86架构上使用linux。

EN

回答 4

Stack Overflow用户

发布于 2009-11-08 03:51:26

这是来自我的苹果电脑上的<sys/errno.h>

代码语言:javascript
复制
#include <sys/cdefs.h>
__BEGIN_DECLS
extern int * __error(void);
#define errno (*__error())
__END_DECLS

因此,errno现在是一个函数__error()。该函数的实现是线程安全的。

票数 12
EN

Stack Overflow用户

发布于 2009-11-08 03:48:37

在许多Unix系统上,使用-D_REENTRANT编译可确保errno是线程安全的。

例如:

代码语言:javascript
复制
#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) */
票数 10
EN

Stack Overflow用户

发布于 2018-09-15 19:21:38

我们可以通过在机器上运行一个简单的程序来检查。

代码语言:javascript
复制
#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的不同地址。在我的机器上运行的输出如下所示:

代码语言:javascript
复制
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 

请注意,所有线程的地址都是不同的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1694164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档