对“fprintf(stdout, ...)”和“fprintf(stderr, ...)”的调用都保证不与多个线程交错吗?

Der*_*unk 3 c linux concurrency multithreading multicore

假设我有两个线程将某些内容(相对较长)打印到 或stderrstdout这两个流的函数是否都是线程安全的,因为它们永远不会“交错”字符?因此,例如,如果我有“Hello, World”,我将永远不会得到“HHellllo,, WorldWorld”或其他任何交错?适用于 x86、GCC、Linux > 3.0。

Dre*_*nis 6

我看了一下 glibc,每次调用都会调用流上的vfprintfPOSIX flockfile( _IO_flockfile) 和funlockfile( ) 。_IO_funlockfile

因此,调用中的字符不会与另一个线程调用中的字符交错,因为只有一个线程可以持有stdout或 的锁stderr

不过,对于跨不同线程的多个调用的顺序,所有的赌注都是不成立的。

  • 此外,C2011 具有线程支持,并且它表示关于针对单个调用跨线程锁定单个 I/O 通道的等效内容。然而,标准没有提及如果一个线程在 stdout 上写入而另一个线程在 stderr 上写入时会发生什么情况;由于并发执行,这些输出可能会在屏幕上交错显示。 (2认同)