0

ファイルを読み書きするマルチスレッドプログラムがあります。1 つのスレッドがデータを受け取り、ファイルに書き込みます。250 Mb のデータごとに、新しいファイルが作成されます。他の複数のスレッドがこれらのファイルを読み取ってデータを取得できます。C++ std ファイル ストリームを使用しています。

問題を防ぐために、私の現在の実装では、同じファイルに対して 2 つのファイル記述子を使用しています。1 つはリーダー用、もう 1 つはライター用です。ミューテックスは同時に複数のアクセスから保護し、ファイル記述子の位置はミューテックスの所有者が必要とするたびに移動します。

ファイルをできるだけ速く読み込めるようにする必要がありますが、ミューテックスはあまり役に立ちません。

まず、ファイルの読み取りと書き込み、または同時に複数の読み取りを行うことが安全かどうかを知りたいです (すべてのプラットフォームで)。第二に、そうであれば、HDD の「ディスク読み書きヘッド」のようなハードウェアにとってどのように安全かを知りたいです。ソフトウェアは常にディスク上で動作してデータを保存しますが、アルゴリズムによってハードディスクの寿命が短くなりすぎないようにします (すでに短い)。

ご協力ありがとうございました

4

1 に答える 1

1

複数のスレッドが同じファイルを読み取っても問題ありません。

さて、私があなたの説明を正しく理解していれば、すでに書き込まれたデータを変更するのではなく、250Mb に達するまでファイルにデータを追加し続け、新しいファイルに書き込みを続けます。

この場合、ミューテックスはまったく必要ないかもしれません。たとえば、「ファイル」全体を 250 MB に達するまでメモリに保持し、それからすべてをディスクに書き込むことができる場合があります。気兼ねなく自由に読めます。まだ書き込まれているファイルについては、すでに書き込まれたバイト数 (または文字列など) を保持するグローバル整数を持つことができ、読み取りスレッドはこの整数によって制限され、ロックは必要ありません。 、既にデータを書き込んだ後にのみ整数を更新する限り。(データを書き込むスレッドは1つしかないと言ったので)。

整数を読み取るだけでは、複数のスレッドによって同時に実行され、単一のスレッドによって書き込まれる場合でも、整数が破損することはありません。したがって、これにより、リーダー スレッドが制限を超えて読み取られることがなくなり、そのような制限は常に安全で一貫性が保たれます。書き込みスレッドは、終了するまで読み取りスレッドに悩まされないことが保証されている領域に平和的にデータを書き込むことができます。

2 番目の質問については、現在書き込み中のファイルを完全にメモリに保持できる場合、HDD の使用量と時間を節約できます。さらに、最近のほとんどの HDD には 32Mb 以上のキャッシュがあるため、大量のスレッドがランダムなファイルとそれらのランダムな部分を常に読み取る場合を除き、すべての読み取りと書き込みが HDD 自体に直接ヒットするわけではないことに注意してください。その場合、HDD を助けるためにできることはあまりないでしょう。そうでない場合は、OS とキャッシュが意図したとおりに動作するため、あまり心配する必要はありません :)

于 2013-06-21T15:08:00.783 に答える