2017-02-09 5 views
-1

私は、同時キューを使用して 同時キューデキュー

作成アクションデリゲートによって、複数のスレッドを経由

Action action =() => 
     { 
      SubscriptionResponseModel subsModel; 
      while (concurrentQueue.TryTake(out subsModel)) 
      { 
       MakeTransactionAndAddIntoQueue(subsModel); 
      } 
     }; 
をキューからデータをデキューし、このアクションデリゲート並列複数のスレッド

Parallel.Invoke(action, action, action, action, action, action, action, action, action, action, action, action, action, action, action); 

を起動しています私が知りたいです私が複数のアクションでSubscriptionResponseModel subsModel;を使用しているときの1つのことはスレッドセーフですか?

+0

は 'SubscriptionResponseModel' – Trey

+2

は何ですか?上記の例で私がやっていることは正しいことです。あなたが投稿した@maheshsharmaコードは、あなたが望むものを実現する –

答えて

1

actionの各呼び出しには独自のsubsModelがあるため、キューから値を取得するためにスレッドを使用するとスレッドセーフです。

// ********** Code showing non-thread safe case ************** 
    SubscriptionResponseModel subsModel; 
    Action action =() => 
    { 
     // all invocations of `action` will share subsModel as it is captured. 
     while (concurrentQueue.TryDequeue(out subsModel)) 
     { 
      MakeTransactionAndAddIntoQueue(subsModel); 
     } 
    }; 

注:

  • のかどうかのプロパティを使用していない/ SubscriptionResponseModelの方法は、スレッドがありますキャプチャ外側の文脈から変数をするとき、それはスレッドセーフされない

    ケースがありますその種類によって安全です。

  • 複数のTryDequeueを同時に実行してもパフォーマンスが向上しない可能性は非常に高いです。 Parallel.Invoke複数のビジー・ループは、複数のスレッドが常に空のキューに問合せを行うのを単にブロックします。私は並列我々はこれを行うことができますどのように私の同時キューを消費したい場合
+0

のあなたの*実装*に依存することSubscriptionResponseModel –

+0

を提案してください。あなたの仕事があなた次第であることは実際には有用なのですか?あなたの実際の目標を達成するためのよりよい方法について別の質問をしたいかもしれません(コードの全ポイントが "並行キューを並行して消費する"ことはほとんどありません - 新しい質問をする場合は実際の使用シナリオを追加してください) –