3

さまざまなファイルの書き込みと読み取りを行うスレッドがいくつかあります。

すべてのディスク操作に単一のロック{}(すべての保護された領域に同じ変数)を使用しても大丈夫ですか?だから私はシークについてディスクへの読み取りと書き込みを同時に行う2つのスレッドを持っていませんか?

また、スレッドで読み取りに使用したり、別のスレッドで書き込みに使用したりできると聞きましたが、これは常に当てはまりますか?なぜ?

4

4 に答える 4

2

各スレッドが異なるファイルの読み取りまたは書き込みを行う場合、同時実行が必要な理由がわかりません。

通常、読み取りと書き込みのために同じファイル(リソース)にアクセスする複数のスレッドがあります。そのシナリオでは、スレッドがファイルに書き込んでいるとき、他のすべてのスレッドは待機する必要があります。これは、「リーダー-ライター」と呼ばれる古典的な同時実行の問題です。

詳細については、http : //en.wikipedia.org/wiki/Readers-writers_problemを参照してください。

于 2012-04-24T05:27:26.433 に答える
1

どのスレッドからも他のスレッドのコードにアクセスしていない場合は、同期用の1つのオブジェクトで十分ですが、リソースを待機しているスレッドキューが増加します。リソースまたはリソースのグループごとに1つの同期オブジェクトがより適切なオプションです

于 2012-04-24T05:22:00.370 に答える
0

ロックを1つだけ使用すると、アプリケーションの速度が低下する可能性があります。スレッドが長時間ファイルを書き込んでいる場合は、他のスレッドが他のファイルを読み取れるようにする必要があります。どのスレッドがどのファイルにアクセスするかについて、より正確に教えてください。

于 2012-04-24T05:43:16.333 に答える
0

あなたの要件はやや紛らわしく、変化しているようです。あるコメントは、「スレッドは同じファイルに書き込んでいる」と別のコメントは「すべてが同じファイルのコレクションに同時に書き込んでいる」と述べています。

いくつかの選択肢があります:

1)1つのロックで読み取りと書き込みをロックします。これは最も単純な方法ですが、ディスク操作の間ロックが保持されるため、呼び出し元のスレッド間で競合する可能性が最も高くなります。

2)ファイルごとに1つのリーダー/ライターロックを使用して読み取りと書き込みをロックします。これは、(1)とは異なるファイルのコンテンツが発生しないという点で優れています。同じファイルへの読み取り/書き込みの間にまだ競合が存在する可能性があります。

2)1つのライタースレッドへの読み取り/書き込みをキューに入れます。これは、書き込み要求をデキューして実行するときにファイル間でスワップする必要があるため、ディスクをより多く行使する傾向がありますが、呼び出し元のスレッドでの書き込みの競合を最小限に抑えます-ポインターをプッシュするのにかかる時間だけキューをロックする必要があります。呼び出し側のスレッドは、読み取り要求が完了するまでシンクロオブジェクトを待機する必要があるため、読み取りは低速の操作になります。書き込みでの競合は少ないが、すべての読み取りでの待ち時間は長い。

3)(2)と同様ですが、ファイルごとにスレッドを使用します。これは、いくつかのファイルのメモリに関して高価になる可能性があり、出力ファイルが複数の物理ディスクに分散している場合にのみ(2)実際に役立ちます。(2)と同様に、競合が少なく、読み取りが遅い。

4)スレッドプールタスクとして書き込みをキューに入れる。これを正確に行う方法がわかりません-ファイルコンテキストをパラメータとして渡す必要があり、それにアクセスするにはおそらくロックアップする必要があります-これは効果的に機能しない可能性があります。(2)と同様に、競合が少なく、読み取りが遅い。

5)この要件を完全に回避するようにアプリを再設計しますか?

于 2012-04-24T08:03:12.413 に答える