2 つのスレッドが両方とも fopen()
で同じファイルを開く場合 、それぞれ独立したファイル ストリーム (FILE *
) 同じファイルを参照する独立したファイル記述子に支えられています。 2 つのファイル ストリームに個別に書き込むことができますが、ファイルの最終的な結果は、スレッドが書き込む場所とファイル ストリームをいつフラッシュするかによって異なります。各スレッドが書き込む場所を制御しない限り、結果は予測できません。最も簡単な方法は、両方のスレッドが同じファイル ストリームを使用するようにすることですが、おそらくスレッド間で調整する必要があります。 POSIX では、C 関数がファイル ストリームへの調整されたアクセスを提供する必要があることに注意してください — flockfile()
を参照してください。
(FILE *)
を参照するすべての関数 オブジェクト (名前が _unlocked
で終わるものを除く) 、 flockfile()
を使用しているかのように動作します と funlockfile()
これらの (FILE *) オブジェクトの所有権を内部的に取得します。
両方のスレッドで追加モードでファイルを開くと、書き込みは毎回安全にファイルの最後に行われますが、バッファがいっぱいになる前にデータをフラッシュすることについて心配する必要があります。
ちなみに、ファイルを追記モード(O_APPEND
)で開くと open()
で 、 "a"
を使用 fopen()
で )、すべての書き込みはファイルの最後にある必要があり、インターリーブされた書き込みで問題が発生することはありません — おそらく、独立したスレッドがファイル ストリームを使用して、一度にバッファーフル以上の書き込みを行っている場合を除きます。 fflush()
を使用しています 出力の各行の一部を書き込んだ後、または write()
を使用している またはその無数の親戚の1人が毎回行の一部を書きます。追加モードでも問題が発生する方法はありますが、通常はそれらに遭遇しようとする必要があります.
fopen()
再入可能です 、同じファイルを指す記述子を好きなだけ持つことができます。
複数の記述子を使用してファイルを読み書きした結果として得られるのは、スレッドの安全性の問題ではなく、ほとんどの場合 (ファイルが読み取り専用の場合を除いて) 動作しない同時ファイル アクセスです。