3

WorkerThreadキュー内の要素に対してジョブを実行するがあり、何かを作成するいくつかのMiningThreadがによって実行される必要がありますWorkerThread

要約すると、1つのスレッドがデキューし、複数のスレッドがエンキューします。

msdnで提案されている同期パターンを使用する必要がありますか、それともこの特定のシナリオでスレッドセーフですか?

msdnからの単純な同期アクセスパターン

Queue myCollection = new Queue();
lock(myCollection.SyncRoot)
{
    foreach (object item in myCollection)
    {
        // Insert your code here.
    }
}
4

2 に答える 2

6

はい、同期する必要があります。

「ConcurrentQueue」と呼ばれる、同期する必要のない.NET4キューがあります:http: //msdn.microsoft.com/en-us/library/dd267265.aspx

ただし、.NET4に移行する必要があります。それまでは、自分で同期を行う必要があります。

更新: 特定のパターンについては、.NET4で利用可能なさらに特殊なクラス、プロデューサー/コンシューマーパターンを含むBlockingCollectionがあります:http: //msdn.microsoft.com/en-us/library/dd267312.aspx

まだ.NET4タフ...:)

于 2012-05-22T09:52:07.750 に答える
1

Queueスレッドセーフとは言えないため、マルチスレッドアプリケーションで使用することはできません。SyncRootプロパティまたはSynchronizedメソッドを使用して、同期を実装できます。

于 2012-05-22T09:49:22.763 に答える