【问题标题】:Is stat(2) thread safe?stat(2) 线程安全吗?
【发布时间】:2021-10-31 09:21:45
【问题描述】:

C 库的许多函数都明确标记为线程安全或非线程安全。例如,当我查看gmtime(3) 的手册时,有一个很好的表格显示了这些函数中哪些是线程安全的,哪些不是。

查看stat(2) 函数的手册页,它并没有说任何一种方式。除非另有说明,否则函数是否应该是线程安全的?

阅读POSIX Safety Concept 并没有真正清楚地说明未标记为不安全的函数是安全的。也许我在某个地方漏掉了一句话?

【问题讨论】:

  • _r 结尾的函数是线程安全的。例如,gmtime 不是线程安全的,因为它返回一个指向可以被不同线程覆盖的公共/隐藏全局的指针。但是,gmtime_r 线程安全的,因为它返回的指针是您传递给它的第二个参数。假设你向它传递一个对每个线程都是唯一的指针(例如,指向堆栈上的一个变量)。
  • @CraigEstey 是的。它在gmtime 手册页中有明确记录,而对于stat() 函数,什么也没有。因此,正如 Barmar 下面提到的,POSIX 中肯定有一个默认值。

标签: c multithreading posix libc


【解决方案1】:

Thread Safety 上的 POSIX 页面说所有函数都是线程安全的,除了那里列出的函数。 stat() 不在列表中,任何变体也不在列表中(lstat()fstat_at()fstat())。所以它应该是线程安全的。

【讨论】:

  • 我找到了direct link。这页上写得很清楚。从您提供的链接中很难找到...
  • 没想到不是直接链接,我点了内容里面的那个部分后复制的。它们使直接链接变得棘手。
【解决方案2】:

gmtime 例程返回一个静态指针,这意味着它可以被其他调用覆盖。

Stat 不返回指针,您正在为它提供要填充的结构。因此它不能被覆盖。

【讨论】:

  • 函数可能是非线程安全的,除了返回指向静态数据的指针之外。
  • 我准备相信它,但要么举个例子。
  • 查看我的答案链接到的非安全函数列表。只有少数返回静态指针。
  • 其中一些是不安全的,因为它们修改了可以在线程之间共享的数据,但不使用互斥锁。例如。 putc_unlocked()putenv().
猜你喜欢
  • 1970-01-01
  • 2020-04-15
  • 2011-11-16
  • 2011-07-04
  • 2014-04-26
  • 2012-11-30
  • 2010-12-30
  • 2013-03-12
  • 2021-08-03
相关资源
最近更新 更多