私はすべて同じ辞書に書き込む必要がある複数のスレッドを持っています。 私は、ただ1つのスレッドが辞書を一度に更新していることを確認するために、私が維持しているオブジェクトにロックをしています。 私の質問は以下の通りです。あるスレッドが別のスレッドがロックしている間にあるスレッドが辞書を更新しようとすると、そのスレッドは待機することを知っていますか?それはちょうど失敗するでしょうか?スレッドがただ待っているなら、私は待ってからあまりにも多くのものを避けることができます、5つのtheadsの最大をキューに入れることができる方法はありますか?dotNetのロックとマルチスレッド
答えて
1つのスレッドがロックを保持していて、2番目のスレッドが同じロックを取得しようとすると、2番目のスレッドは待機します。
スレッドだけが書き込みを行うのですか、読み取り操作もしていますか?その場合は、おそらくReaderWriterLockSlim
を使用するべきです(まだ行っていない場合)。これにより、スレッドが更新されている場合を除いて、複数のスレッドを並列に読み取らせることができます。この場合、リソースへの排他的アクセス権が得られます。
lock(obj)ステートメントは、スレッドが完了するまで他のスレッドが共有リソースにアクセスするのをブロックします。
ロックはオブジェクト自体を保護しません。ロックは、他のスレッドが同じロックを取得するのを防ぎます。ロックがリソース(辞書のような)を保護するように設計されている場合、リソース(辞書)にアクセスする前に他のスレッドが協調して同じロックを取得する必要があります。スレッドがこれを無視してリソースにアクセスしない場合は、辞書内の無効な一時的な状態に遭遇し、結果としてすべての種類のエラーが発生する可能性があります。これは、読み取り操作と書き込み操作の両方に適用されます。 .Netのコレクションクラスには、一般に、複数のスレッドアクセスが拒否された場合に使用するすべてのスレッドに推奨されるオブジェクトであるSyncRootという名前のプロパティがあります。 Fredrikが既に指摘しているように、複数、共有、読み取り、単一の排他的な書き込みを可能にする特殊化されたReaderWriterタイプがあります。あまりにも多くのスレッドがリソースを待っている場合には、操作を避けるようなより複雑なスキームは、完全に安全で正しい方法でコード化するのは非常に難しいので、このような複雑さを回避し、基本プリミティブに固執する方が良いです。
- 1. 異なるオブジェクトのロックでのマルチスレッド
- 2. JAVAのマルチスレッドでの同期とオブジェクトのロック
- 3. Oracle Dotnet ProviderとINSERT ALLステートメント
- 4. Firebirdのdotnetバッチインサート
- 5. マルチスレッド時に単一のbool変数をロックする?
- 6. solrのjavaとdotnetのバージョンの違い
- 7. DotNetのパッチ開発
- 8. dotnet dllデコンパイルとコードの変更
- 9. Visual Studio 2010のPrism 4とdotnet 3.5
- 10. DotNet Oracle ORM
- 11. dotnet 5.4 - System.IO
- 12. マルチスレッドと一緒にマルチスレッドでログインする
- 13. Wicketとマルチスレッドのビジネスオブジェクト
- 14. HTTPSとマルチスレッドのCurl
- 15. Javaのスレッドとマルチスレッド
- 16. jQueryツリービューコントロールwithチェックボックス+ DotNet
- 17. Google API v3 for dotnet;
- 18. CSharp/DotNet:シリアライゼーション、ジェネリックス、ベースクラス
- 19. NSManagedObjectContextsとマルチスレッド
- 20. エンティティフレームワークとマルチスレッド
- 21. TransactionScopeとマルチスレッド
- 22. マルチスレッドとstrtok
- 23. Javaマルチスレッドとオブジェクト
- 24. C++:マルチスレッドと
- 25. タイマーとマルチスレッド
- 26. TransX WCFとマルチスレッド
- 27. スプリングとマルチスレッド
- 28. UIGraphicsBeginImageContextWithOptionsWithOptionsWithOptionsとマルチスレッド
- 29. エンティティフレームワークコアとマルチスレッド
- 30. マルチスレッドとイベント