POSIX 标准真的意味着非线程安全函数可以破坏所有其他函数的线程安全吗?

问题描述 投票:0回答:1

Posix 标准说

"3.407 线程安全 线程安全函数可以与其他调用同时安全地调用 到同一函数,或调用任何其他线程安全函数,通过 多线程。系统接口卷中定义的每个函数 除非另有明确说明,否则 POSIX.1-2017 是线程安全的。例子 是任何“纯”函数,即在互斥锁处于锁定状态时保持互斥锁锁定的函数 访问静态存储或线程之间共享的对象。”

这是否表明允许编写 libc 实现,以便执行不受互斥锁保护的非线程安全函数可能会破坏并发执行的每个所谓线程安全函数的线程安全性?

非线程安全数学函数 lgamma() 的执行似乎不太可能以某种方式干扰另一个线程中完全不相关的线程安全函数的执行,但在我看来,标准允许这样做,因此“纯”函数可能变得线程不安全。这是意图吗?

更有可能的是,mblen() 可能会破坏并发执行的 mbrlen() 的线程安全性。但这会严重限制线程的实用性。这意味着我无法在不仔细检查代码的情况下向现有应用程序添加新线程,因为存在渗透的可能性。

或者这只是标准中的糟糕措辞(这不是第一次)?

这是理论上的;我还没有尝试证明这一点,我希望我是错的

c++ c language-lawyer posix
1个回答
0
投票

不,事实并非如此。这意味着同时从两个线程调用两个这样的函数会破坏一切的线程安全。

但是也有一些例外。

chdir()
setenv()
unsetenv()
是超级非线程安全的,可能会导致线程安全函数出现问题。

chdir()
:大多数 FS 功能都不会乐意在中间更改当前目录。

setenv()
unsetenv()
getenv()
被列为线程安全,但如果从另一个线程调用其中一个,则不是线程安全的。

© www.soinside.com 2019 - 2024. All rights reserved.