3

私のプログラムでは、ファイルを処理する必要があります。私のプログラムは複数のスレッドを使用してファイルを処理する可能性があるため、各ファイルを一度に複数のスレッドで処理するべきではないため、何らかのロックが必要です。

private object lockObj = new object();

public void processFile(string file)
{
  lock(lockObj)
  {
    //... actuall processing
  }
}

上記のコードでは、一度に1つのファイルしか処理できませんが、2つのスレッドが一度に2つの異なるファイルを処理できる必要がありますが、同じファイルは処理できません。

私の最初のアイデアは、キーがファイルに、値がロックオブジェクトになっている辞書を作成することでした。しかし、文字列ファイルをロックすることも可能かどうか疑問に思いましたか?これについて何か考えはありますか?

PS:より良いタイトルを見つけることができずに申し訳ありません

4

3 に答える 3

4

私の最初のアイデアは、キーがファイルであり、値がロックオブジェクトであるディクショナリを作成することでした。しかし、文字列ファイルをロックすることも可能かどうか疑問に思っていましたか? これについて何か考えはありますか?

文字列が実行時に作成される場合、文字列のロックは安全ではありません。オブジェクトの辞書を作成し、それらを使用してロックする方がよいでしょう。

そうは言ってもConcurrentDictionary<string,object>、辞書自体での競合状態 (または他のロック) を防ぐため、この辞書に を使用することを検討する必要があります。GetOrAddを使用すると、ロックに使用する適切なオブジェクトを安全に取得できます。

そうは言っても、ここでは別のアプローチが適切かもしれません。ConcurrentQueueまたはを使用して、BlockingCollection処理するアイテムのリストを提供し、固定数のスレッドでそれらを処理することができます。これにより、そもそも同期の問題が発生するのを防ぐことができます。

于 2012-08-24T19:30:27.593 に答える
2

あなたはこれに間違った方法でアプローチしていると思います。BlockingCollectionでプロデューサー/コンシューマー パターンを使用するだけです。スレッドはファイルを読み取り続けて ( を使用して) キューに入れAdd、多数のワーカー スレッドがキューから取得し ( を使用してTake) ファイルを処理し続けます。キューが実装されている方法では、2 つのスレッドが同じファイルを取得できないことが保証されているため、明示的なロックは必要ありません。

于 2012-08-24T19:31:33.213 に答える
0

C# でスレッドを操作している場合は、タスク並列ライブラリ (TPL) を確認する必要があります。習得には時間がかかりますが、コツをつかめば、マルチスレッド コードはよりシンプルで保守しやすくなります。

これは、TPL を使用して求めていることを正確に実行する例です。

于 2012-08-24T19:37:35.390 に答える