当前位置: 首页 > 面试题库 >

errno是线程安全的吗?

屠锐
2023-03-14
问题内容

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

我在x86体系结构上将Linux与gcc一起使用。


问题答案:

是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。

参见http://www.unix.org/whitepapers/reentrant.html

在POSIX.1中,errno被定义为外部全局变量。但是,此定义在多线程环境中是不可接受的,因为使用它会导致不确定的结果。问题是两个或多个线程可能会遇到错误,所有错误都会导致设置相同的错误号。在这种情况下,一个线程可能已经被另一个线程更新后,最终检查errno。

为了避免产生不确定性,POSIX.1c将errno重新定义为可以访问每个线程错误号的服务,如下所示(ISO / IEC
9945:1-1996,§2.4):

某些函数可能在通过符号errno访问的变量中提供错误号。errno符号是通过包括C标准所指定的标头定义的。对于进程的每个线程,errno的值均不受其他线程对函数的调用或对errno的分配的影响。

另请参阅http://linux.die.net/man/3/errno

errno是线程本地的;在一个线程中设置它不会影响在其他任何线程中的值。



 类似资料:
  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。

  • 问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn

  • 在我的应用程序中,我使用多个线程来处理客户端连接。 我在调试时发现了一个非常奇怪的行为——我有一个SelectionKey,通过调用(使用调试器)它的interestTops()方法,返回值是1(READ),但当我将数据发送到与该键对应的套接字时,选择器不会被唤醒。。 如果使用调试器,我将特定选择键更改为1(即使是1),选择器会突然对该更改做出反应。 在给定的时间内,我只有一个线程处理一个连接,但

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

  • 问题内容: 在Go编程语言中,线程安全吗?AFAIK,其文档未提及线程安全性。 问题答案: 没有。 Go文档遵循一个简单的规则:如果未明确声明并发访问某事是安全的,则不是。

  • 问题内容: 很简单,可以从多个线程中使用一个实例(例如),还是需要将多个实例放在一个线程中? 问题答案: 不,不是。该实例是有状态的。因此,您需要将其存储在threadlocal中,或者在每次加密/解密调用中获取一个新实例,或者将其包装在一个块中。 Threadsafety通常在Javadoc中提到“ 是线程安全的 ”或“ 是 不是 线程安全的 ”。情况并非如此,因此您不应假定它是线程安全的。