C11 相当于 POSIX flockfile()?

标签 c thread-safety posix

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

在相关说明中,是否可以安全地假设任何声称符合 POSIX 的实现都会尊重 flockfile()当使用 C11 线程.h 时?我认为大多数支持threads.h的主要POSIX兼容C实现都是通过在pthreads上构建的,这意味着这种假设通常是安全的。但是,多线程很难,知道异常会很有帮助。

最佳答案

Both POSIX and C11 require that streams have an associated lock to prevent data races and interleaving.


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

POSIX documents flockfile() and related functions to allow thread-safe I/O to span multiple calls. Is there an equivalent C function?


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

On a related note, is it safe to assume any implementation claiming POSIX conformance will respect flockfile() when using C11 threads.h?


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

I think most major POSIX-compliant C implementations that support threads.h do so by building on pthreads, which would imply such an assumption is usually safe. However, multithreading is hard, and it would be helpful to know of exceptions.


在实践中,我期望 POSIX 系统上的 C11 和更高版本的实现将确保 C11 线程实际上确实具有 POSIX 线程的语义,无论是通过在 POSIX 线程之上实现 C11 线程还是通过其他方式。因此,有理由希望 C11 线程能够根据需要与 flockfile() 进行互操作。 ,但省略专门探测该细节的单元测试是不合理的。
另请注意,在这样的上下文中,“通常安全”是说“不安全”的一种狡猾的方式。

关于C11 相当于 POSIX flockfile()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54897650/

相关文章:

c# - 共享字典的 WCF 方法

c - 如何在 C 中编写 "thread safe"函数?

c++ - 函数体中静态定义的互斥量是否能够正确锁定?

c - POSIX 线程 API 的版本如何?自 1995 年以来是否已更新?

c - 在这些声明下,以下表达式是什么类型,它们是否正确?

c - 使用 while 循环而不是 pow : What does this error mean?

c - 不同的Linux消息队列有相同的id?

regex - grep(POSIX) 单行空格之间的正则表达式浮点

c++ - Gsoap编译

c - 如何在不使用 fgets() 的情况下读取带空格的字符串