簡単な質問:
プログラムにログを追加する必要があります。
2 つのプロセスが同じファイルに対して「fwrite」を使用するが、同じファイル記述子ではない場合、書き込まれるログ メッセージはアトミックまたは混合になります。長さ制限はありますか?
ANSI-C の動作が定義されているか、または実装が定義されていますか? 後者の場合、MacOSX、Linux、および Windows MSVC には何がありますか?
いくつかの調査を行った後、このリンクで次のことがわかりました。
POSIX 標準では、C stdio の FILE* 操作がアトミックである必要があります。POSIX 準拠の C ライブラリ (Solaris や GNU/Linux など) には、FILE* に対する操作をシリアル化するための内部ミューテックスがあります。
呼び出しはアトミックであるように見えますが、プラットフォームによって異なります。同じリンクには、プログラマーが注意する必要があると思わせる別の段落もあります。
したがって、3.0 の場合、「マルチスレッドは I/O に対して安全ですか」という質問には、「プラットフォームの C ライブラリは I/O に対してスレッドセーフですか?」と答える必要があります。デフォルトのものもあれば、そうでないものもあります。多くは、スレッドセーフと効率のさまざまなトレードオフで C ライブラリの複数の実装を提供します。プログラマーは、常に複数のスレッドに注意する必要があります。
また、FILE*
2 つの異なるプロセスで 2 つの異なるものがあるため、選択の余地はないと思います。
Debianlennyの「manflockfile」から、stdio関数はスレッドセーフです。
詳細については、スレッドセーフでないstdio関数「manunlocked_stdio」があります。
詳細については、マニュアルページを参照してください。
Visual Studio の fwrite は呼び出しスレッドをロックするため、スレッドセーフです