14

簡単な質問:

プログラムにログを追加する必要があります。

2 つのプロセスが同じファイルに対して「fwrite」を使用するが、同じファイル記述子ではない場合、書き込まれるログ メッセージはアトミックまたは混合になります。長さ制限はありますか?

ANSI-C の動作が定義されているか、または実装が定義されていますか? 後者の場合、MacOSX、Linux、および Windows MSVC には何がありますか?

4

4 に答える 4

18

いくつかの調査を行った後、このリンクで次のことがわかりました。

POSIX 標準では、C stdio の FILE* 操作がアトミックである必要があります。POSIX 準拠の C ライブラリ (Solaris や GNU/Linux など) には、FILE* に対する操作をシリアル化するための内部ミューテックスがあります。

呼び出しはアトミックであるように見えますが、プラットフォームによって異なります。同じリンクには、プログラマーが注意する必要があると思わせる別の段落もあります。

したがって、3.0 の場合、「マルチスレッドは I/O に対して安全ですか」という質問には、「プラットフォームの C ライブラリは I/O に対してスレッドセーフですか?」と答える必要があります。デフォルトのものもあれば、そうでないものもあります。多くは、スレッドセーフと効率のさまざまなトレードオフで C ライブラリの複数の実装を提供します。プログラマーは、常に複数のスレッドに注意する必要があります。

また、FILE*2 つの異なるプロセスで 2 つの異なるものがあるため、選択の余地はないと思います。

于 2010-02-08T09:31:08.893 に答える
5

それは混合することができます。

複数のスレッド/プロセスが同じファイルに書き込む場合は、ロックを使用する必要があります。

別の方法は、ログ メッセージを専用のサービス/スレッドに送信することです。採用する優れたツールはsyslogです。これはすべての UNIX に確実にインストールされ、Windowsで実行できます。

于 2010-02-08T09:20:57.543 に答える
2

Debianlennyの「manflockfile」から、stdio関数はスレッドセーフです。

詳細については、スレッドセーフでないstdio関数「manunlocked_stdio」があります。

詳細については、マニュアルページを参照してください。

于 2010-11-16T13:38:00.123 に答える
-1

Visual Studio の fwrite は呼び出しスレッドをロックするため、スレッドセーフです

于 2013-11-27T13:10:10.623 に答える