-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;在多个操作中使用时,我想知道一件事是线程安全的吗?

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 回答