2010-12-04 6 views
10

可能性の重複:
stdout thread-safe in C on Linux?同時に実行されるスレッドでprintfを呼び出すのはスレッドセーフですか?

セイスレッド1と、彼らの両方のprintf類似しており、彼らの仕事の終わりにスレッド2です。スレッドセーフなのか、何らかの形でprintfをロックする必要がありますか?

stdoutに関連していますか?各printfの後にfflush(stdout)を実行するとどうなりますか?それは何かを変えますか?文字で動作

+1

http://stackoverflow.com/questions/467938/stdout-thread-safe-in-c-on-linux – icecrime

答えて

11

POSIX.1とC言語の関数 はがそのように実装することが にPOSIX.1cではによって必要とされる( タイプ・ファイルのオブジェクトへのポインタによって表される)ストリーム 再入(ISO/IEC 9945:1-1996、§8.2を参照)。いくつかの関数は、引数に応じて、リエントラントまたは非リエントラントになります

Thread-safety and POSIX.1

ノートを参照してください。

+8

これらの機能は*リエントラントではありません。スレッドセーフです。大きな違いがあります。再入可能な関数は自動的にスレッドセーフですが、スレッドセーフな関数は、すでに実行中の同じスレッド(シグナルハンドラなど)から再度呼び出されるとデッドロック(または悪化)する可能性があります。 –

+0

次の参照先があります:http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.htmlおよびhttp://www.opengroup.org/onlinepubs/9699919799/functions/flockfile.html特に後者は:( 'FILE *')オブジェクトを参照するすべての関数は、( 'FILE *')オブジェクトの所有権を得るために 'flockfile()'と 'funlockfile()'を内部的に使用するように振る舞います。 –

+0

Posixはスレッドの安全性、再入可能性、および非同期シグナル安全性の点で異なります。 FILE *関数は非同期シグナルセーフではありません。 – nos

関連する問題