POSIX 和 C11 都要求流具有关联的锁以防止数据竞争和交错。
是的,但对该锁的特定形式没有要求,C 也没有要求程序可以直接访问该锁,也没有任何标准机制可以做到这一点。
POSIX 记录了flockfile() 和相关函数以允许线程安全I/O 跨越多个调用。是否有等效的 C 函数?
没有任何已发布的 C 语言规范版本记录了flockfile()、ftrylockfile()或funlockfile(). 一个严格符合 C11 或 C17 的程序想要防止被交错的不同线程调用 I/O 函数将(因为它是严格符合的)在未定义宏的实现上使用 C 线程库__STDC_NO_THREADS__。这样的程序可以为此目的使用该库的互斥锁实现。没有直接访问与单个FILE对象直接关联的任何锁的标准方法。
在相关说明中,假设任何声称符合 POSIX 的实现在使用 C11 threads.h 时都会尊重flockfile() 是否安全?
据我所知,POSIX C 语言接口仍然是专门根据 C99 定义的,因此 POSIX 对 C11 线程视而不见。从这个意义上说,不,假设关于线程行为的 POSIX 规定将适用于 C11 线程是不安全的。
我认为大多数支持threads.h的主要POSIX兼容C实现都是通过在pthreads上构建的,这意味着这种假设通常是安全的。但是,多线程很难,知道异常会很有帮助。
在实践中,我期望 POSIX 系统上的 C11 和更高版本的实现将确保 C11 线程实际上确实具有 POSIX 线程的语义,无论是通过在 POSIX 线程之上实现 C11 线程还是通过其他方式。因此,希望 C11 线程能够与flockfile().
另请注意,在这样的上下文中,“通常安全”是说“不安全”的一种狡猾的方式。