-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 つ知りたいのは、スレッドセーフですか?.

4

1 に答える 1

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複数のビジー ループを使用すると、常に空のキューをクエリする複数のスレッドが単純にブロックされます。
于 2017-02-09T19:11:24.410 に答える