C11 等效于 POSIX flockfile()?

ov2*_*v2k 5 c posix thread-safety

POSIX 和 C11 都要求流具有关联的锁以防止数据竞争和交错。POSIX 文档flockfile()和相关函数以允许线程安全 I/O 跨越多个调用。是否有等效的 C 函数?我不记得一个,也找不到提到的一个,这并不一定意味着一个不存在。

在相关说明中,假设任何声称flockfile()在使用 C11 线程时遵守 POSIX 一致性的实现是否安全?我认为大多数支持threads.h的主要POSIX兼容C实现都是通过在pthreads上构建来实现的,这意味着这种假设通常是安全的。但是,多线程很难,了解异常会很有帮助。

Joh*_*ger 3

POSIX 和 C11 都要求流具有关联的锁以防止数据竞争和交错。

是的,但是对该锁的特定形式没有要求,C 也没有任何要求使程序可以直接访问该锁,也没有任何这样做的标准机制。

POSIX 记录了 chunkfile() 和相关函数,以允许线程安全 I/O 跨越多个调用。是否有等效的 C 函数?

没有已发布的 C 语言规范版本记录了flockfile()ftrylockfile()或的类似内容funlockfile()。一个严格符合 C11 或 C17 的程序,如果想要防止交错的不同线程调用 I/O 函数,将(因为它严格符合)在未定义宏的实现上使用 C 线程库__STDC_NO_THREADS__。这样的程序可以使用该库的互斥实现来达到此目的。没有标准方法可以直接访问与各个FILE对象直接关联的任何锁。

与此相关的是,在使用 C11threads.h 时,可以安全地假设任何声称符合 POSIX 一致性的实现都将尊重 FClockfile() 吗?

据我所知,POSIX C 语言接口仍然是专门根据 C99 定义的,因此 POSIX 对 C11 线程是盲目的。从这个意义上说,不,假设有关线程行为的 POSIX 规定适用于 C11 线程是不安全的。

我认为大多数支持 thread.h 的主要 POSIX 兼容 C 实现都是通过构建 pthread 来实现的,这意味着这样的假设通常是安全的。然而,多线程很难,了解异常情况会很有帮助。

实际上,我期望 POSIX 系统上的 C11 和更高版本的实现将确保 C11 线程实际上具有 POSIX 线程的语义,无论是通过在 POSIX 线程之上实现 C11 线程还是通过其他方式。那么,希望 C11 线程能够根据需要与 进行互操作是合理的flockfile(),但忽略专门探测该细节的单元测试是不合理的。

另请注意,在这种情况下,“通常安全”是表达“不安全”的一种巧妙方式。