c - Linux上C中的标准输出线程安全?

标签 c linux unix operating-system

在 Linux 上使用 printf 写入标准输出是线程安全的吗?使用较低级别的 write 命令怎么样?

最佳答案

它不是由 C 标准指定的——它取决于你对 C 标准库的实现。事实上,C 标准甚至根本没有提到线程,因为某些系统(例如嵌入式系统)没有多线程。

在 GNU 实现 (glibc) 中,stdio 中处理 FILE* 对象的大多数高级函数都是线程安全的。名称中通常没有 unlocked 的那些(例如 getc_unlocked(3))。但是,线程安全是在每个函数调用级别:例如,如果您对 printf(3) 进行多次调用,则每个调用都保证以原子方式输出,但其他线程可能会打印在您对 printf() 的调用之间进行处理。如果您想确保一系列 I/O 调用以原子方式获得输出,您可以在它们周围加上一对 flockfile(3)/funlockfile(3) 调用来锁定 FILE句柄。请注意,这些函数是可重入的,因此您可以在它们之间安全地调用 printf(),即使 printf() 本身进行调用也不会导致死锁到 flockfile().

write(2) 等低级 I/O 调用应该是线程安全的,但我不能 100% 确定 - write() 对内核进行系统调用以执行 I/O。这究竟是如何发生的取决于您使用的内核。它可能是 sysenter 指令,或旧系统上的 int(中断)指令。一旦进入内核,就由内核来确保 I/O 是线程安全的。在我刚刚使用 Darwin Kernel Version 8.11.1 进行的测试中,write(2) 似乎是线程安全的。

关于c - Linux上C中的标准输出线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/467938/

相关文章:

c - 如何限制fifo的用户数量?

C 以字节 block 读取文件

c++ - Linux 服务器,向 Windows 客户端发送文件(Socket)

c - 为什么 gcc4 发出警告以及如何避免它

python - TCP 和 UNIX 套接字之间有区别吗?

linux - 在多线程应用程序中使用 qsub (sge)

c++ - const char* 与字符串文字的使用

c - C中的结构初始化数组

c - 使用 DMXSerial Arduino 库发送和接收 DMX-512

linux - 在 Ubuntu 20.04 上安装 Jenkins 时出错