【问题标题】:This code is not thread-safe, isn't it?这段代码不是线程安全的,不是吗?
【发布时间】:2011-12-11 01:02:15
【问题描述】:

我看到一段这样的代码,想知道这是否是线程安全的:

int savedErrno = errno;

//call some function that may modifies errno

if (errno == xxx)
   foo();

errno = savedErrno;

我认为这不是线程安全的,对吗?

但我看到有人写这样的代码,所以我不确定......

谁能帮我澄清一下,谢谢...

【问题讨论】:

  • 你在哪里看到不安全的部分 kai ?
  • @littleadv 它看起来不是线程安全的原因是因为它看起来像 errno 是一个全局变量,因此被所有线程共享。我认为最初是这种情况,直到聪明的系统实现者通过用一些宏魔术替换全局变量来“修复它”,使 errno 成为每个线程的局部变量。尽管 IMO 仍然是一个丑陋的机制......

标签: c++ c linux thread-safety errno


【解决方案1】:

每个线程都有自己的(线程特定的)errno 副本,因此看起来应该是安全的。

来自 man (3) errno:

errno 被 ISO C 标准定义为 int 类型的可修改左值,并且不能显式声明; errno 可能是一个宏。 errno 是线程本地的;在一个线程中设置它不会影响它在任何其他线程中的值。

【讨论】:

    【解决方案2】:

    代码只在一个线程中使用了errno,实际上代码只显示了一个线程。 所以,这个 sn-p 是线程安全的。

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2018-04-12
      相关资源
      最近更新 更多