【问题标题】:Thread-safety of C standard library on OS XOS X 上 C 标准库的线程安全
【发布时间】:2011-12-05 00:30:51
【问题描述】:

在 Mac OS X 的 C 标准库的实现中是否有明确的线程安全函数列表?

关于glibcf*() 函数有一个很好的答案here,但我没有找到任何关于OS X 的此类资源。有这样的事情吗?

例如,strptime()strftime() 是线程安全的吗? printf()?这些可能有我不想搞砸的内部缓冲区。 :)

【问题讨论】:

  • 附带说明(Dave 和 ruakh 为您提供答案)即使某些标准函数保证是线程安全的,但其实现通常会带来高性能损失。像printf 这样的东西是出了名的糟糕,因为它们倾向于序列化你的代码。

标签: c macos thread-safety standard-library


【解决方案1】:

Single Unix 规范给出了a fairly short list of functions that are allowed to be non–thread-safe(除了“旧版功能组”中的函数尽管未在此处列出,但允许是非线程安全的)。该列表包括strtok(),戴夫在他的回答中提到了这一点,但包括strptime(),也不包括strftime(),也不包括printf()

This StackOverflow answer 断言,在回答与这个问题非常相似的问题时,OS X 确实支持规范的上述方面,所以我认为这可能是最好的列表。 (顺便说一下,您可能还会对该问题的其余部分以及其他答案感兴趣。)

【讨论】:

    【解决方案2】:

    任何似乎具有某种神奇记忆能力的函数都可能不是线程安全的。任何返回您不希望指向free() 的指针的函数通常都不是线程安全的。

    您真正需要担心的许多函数返回char*struct foo*。虽然这不是一个完美的规则,但这通常表明一个函数具有某种静态存储,并且不是线程安全的。

    strtok() 是 is 的一个简单示例,已被线程安全的strtok_r() 取代。对于许多非线程安全函数,存在一个function_r()(r 表示可重入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2015-08-01
      相关资源
      最近更新 更多