gpt4 book ai didi

c - MSVCRT 的 fprintf() 线程实现是否安全?

转载 作者:太空狗 更新时间:2023-10-29 17:19:42 26 4
gpt4 key购买 nike

似乎glibc's implementation of fprintf() is thread-safe ,但 Microsoft 的 CRT 也是如此吗?

所谓线程安全,我指的不仅仅是崩溃,还包括如果多个线程(在同一个进程)调用fprintf(),文本不会混在一起。

也就是说,例如,如果线程 A 调用 fprintf(stdout, "aaaa"); 并且线程 B 调用 fprintf(stdout, "bbbb");保证不会混成aabbaabb

有这样的保证吗?

最佳答案

是的。在多线程运行时库中,每个流都有一个关联的锁。此锁在对 printf 函数的任何调用开始时获取,直到 printf 函数返回之前才释放。

此行为是 C11 所要求的(在 C11 之前标准 C 中没有“线程”的概念)。 C11 §7.21.2/7-8 指出:

Each stream has an associated lock that is used to prevent data races when multiple threads of execution access a stream, and to restrict the interleaving of stream operations performed by multiple threads. Only one thread may hold this lock at a time. The lock is reentrant: a single thread may hold the lock multiple times at a given time.

All functions that read, write, position, or query the position of a stream lock the stream before accessing it. They release the lock associated with the stream when the access is complete.

Visual C++ 不完全支持 C11,但它确实符合这一要求。一些其他特定于 Visual C++ 的注释:

只要你没有定义 _CRT_DISABLE_PERFCRIT_LOCKS (它只适用于静态链接的运行时库,libcmt.lib 和 friend )或使用 the _nolock-suffixed functions ,那么单个流上的大多数操作都是原子的。

如果您需要流上多个操作的原子性,您可以通过使用 _lock_file 自行获取和释放流锁来自行获取文件锁。和 _unlock_file .

关于c - MSVCRT 的 fprintf() 线程实现是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22539282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com