【问题标题】:Concurrent queue dequeue并发队列出队
【发布时间】:2017-06-27 22:35:59
【问题描述】:

我正在使用并发队列并通过创建动作委托通过多个线程从队列中取出数据

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; 时,它是线程安全的吗?

【问题讨论】:

  • 什么是 SubscriptionResponseModel
  • 这取决于你的实现SubscriptionResponseModel

标签: c# multithreading delegates concurrent-queue


【解决方案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 的多个繁忙循环只会阻塞多个线程不断查询空队列。

【讨论】:

  • 如果我想并行使用我的并发队列,我们​​该怎么做?这是我在上面的例子中所做的正确方式吗?请建议
  • @maheshsharma 您在帖子中拥有的代码可以实现您想要的。它对您的任务是否真的有用取决于您。您可能想就实现实际目标的更好方法提出单独的问题(您的代码的全部要点不太可能是“并行消耗我的并发队列” - 如果提出新问题,请确保添加实际使用场景)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多