You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

POSIX标准是否允许非线程安全函数破坏其他线程安全函数的线程安全性?

POSIX线程安全标准的合规性疑问

POSIX标准对线程安全的定义如下:

3.407 线程安全
线程安全函数可由多个线程同时调用,无论是调用同一函数,还是调用其他线程安全函数,均可安全执行。POSIX.1-2017系统接口卷中定义的每个函数,除非明确说明,否则均为线程安全。示例包括任何“纯函数”、访问静态存储或线程间共享对象时持有互斥锁的函数。

基于上述定义,我产生了以下疑问:

  • 符合标准的libc实现是否可以被设计为:未受互斥锁保护的非线程安全函数执行时,可能破坏所有并发执行的线程安全函数的线程安全性?
  • 非线程安全的数学函数lgamma()看起来不太可能干扰另一个线程中完全无关的线程安全函数,但从标准表述来看似乎允许这种情况,甚至可能让“纯函数”失去线程安全性。这是标准的本意吗?
  • 更实际的场景是mblen()可能破坏并发执行的mbrlen()的线程安全性,但这会严重限制线程的实用性——意味着在现有应用中添加新线程前必须仔细检查所有代码,避免此类影响扩散。
  • 或者这只是标准的措辞不当?

为了更清晰地聚焦核心问题,我补充两个测试场景:

  1. 场景一:两个线程同时执行mbrlen()函数,且两者的ps参数均不为NULL。根据标准要求,合规的libc实现必须保证这两个调用互不干扰。
  2. 场景二:修改场景一,其中一个线程改为调用mblen()函数,其余条件不变。符合POSIX标准的libc实现是否允许出现mblen()调用导致另一个线程的mbrlen()返回错误结果的情况?

我需要明确的答案:若标准禁止此类干扰,请回答“No”并引用标准中的相关文本;否则回答“Yes”。需注意,若回答“Yes”,则意味着只有所有线程都执行安全函数时单个线程才安全,只有所有并发调用的函数都安全时单个函数才具备线程安全性。

需要强调的是,我关注的是标准的法律措辞,而非libc实现的实际工作方式。我编写的代码基于“No”的假设,目前已有数百万实例在全球运行,且未收到相关错误报告。或许存在此类潜在bug,或许无人添加会产生干扰的线程,但这足以证明libc实现并未利用该漏洞(如果确实存在的话)。


答案:Yes

根据提供的POSIX标准文本,仅明确规定线程安全函数之间的并发调用是安全的(“线程安全函数可由多个线程同时调用,无论是调用同一函数,还是调用其他线程安全函数,均可安全执行”),但并未对“非线程安全函数与线程安全函数并发执行时的相互影响”做出禁止性规定。因此,符合标准的libc实现允许出现mblen()(非线程安全)干扰mbrlen()(线程安全)并发执行结果的情况。


内容的提问来源于stack exchange,提问作者khw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:27:11