将C#ConcurrentBag <T>与多个生产者和一个消费者一起使用

谢伊__

我遇到了多个线程正在创建一个ICollection对象的情况。ConcurrentBag似乎是最好的(?)解决方案,因为-1)每个线程将拥有自己的本地队列,并且2)线程不需要进行通信-它们是独立的。到目前为止,一切都很好,但事实是我需要从该方法返回一个ISet(在所有生产者都终止之后)。即使当前的ConcurrentBag实例不同的(由于应用程序的逻辑得到保证),我仍然需要将其转换为ISet,例如HashSet。至此,不再有生产者。现在是真正的问题:

迭代ConcurrentBag时,调用线程是否将为不在线程本地队列中的每个项目获取锁还是每个线程会抓住一次锁?另外,仅迭代bag和调用bag.Distinct()显式地,锁定方式之间的内部实现是否有所不同?

凯文·高斯

看一下以下源代码ConcurrentBaghttp : //referencesource.microsoft.com/#System/sys/system/collections/concurrent/ConcurrentBag.cs​​,537a65e966c1c38d

遍历袋子触发对的呼叫FreezeBag此方法调用AcquireAllLocks,浏览每个线程的队列并设置一个锁:

/// <summary>
/// local helper method to acquire all local lists locks
/// </summary>
private void AcquireAllLocks()
{
    Contract.Assert(Monitor.IsEntered(GlobalListsLock));

    bool lockTaken = false;
    ThreadLocalList currentList = m_headList;
    while (currentList != null)
    {
        // Try/Finally bllock to avoid thread aport between acquiring the lock and setting the taken flag
        try
        {
            Monitor.Enter(currentList, ref lockTaken);
        }
        finally
        {
            if (lockTaken)
            {
                currentList.m_lockTaken = true;
                lockTaken = false;
            }
        }
        currentList = currentList.m_nextList;
    }
}

每个线程将获取一次锁,而不是每个项目一次。

迭代或Distinct两者都调用将调用该GetEnumerator方法,因此不会有什么区别。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

RabbitMQ:仅使用一个队列服务器时,将各个消费者/生产者捆绑在一起

来自分类Dev

与一个生产者和多个消费者一起使用Queue是否安全?

来自分类Dev

将芹菜的消费者和生产者分开

来自分类Dev

C-Pthreads,一个使用者,多个生产者同步

来自分类Dev

C:生产者/消费者

来自分类Dev

C:生产者/消费者

来自分类Dev

具有一个生产者和多个消费者的生产者-消费者

来自分类Dev

如何在activeMQ中使用多个生产者和一个消费者?

来自分类Dev

一个生产者,多个消费者

来自分类Dev

将BufferBlock与限制选项一起使用给消费者

来自分类Dev

生产者/消费者-生产者将数据添加到集合中而不会阻塞,消费者批量使用集合中的数据

来自分类Dev

使用4.0框架类和Blocking Collection的C#中的生产者/混合消费者

来自分类Dev

C#等待生产者/消费者中的多个事件

来自分类Dev

将Kafka生产者和消费者整合到Web应用程序中

来自分类Dev

一个状态对象的一个生产者多个消费者

来自分类Dev

生产者-消费者在 C 中使用信号量

来自分类Dev

一个快速生产者多个慢速消费者的最佳方案是什么?

来自分类Dev

一个生产者多个消费者表现

来自分类Dev

生产者/消费者:一个生产者,多个消费者,每个都处理相同的数据

来自分类Dev

生产者/消费者:一个生产者,多个消费者,每个都处理相同的数据

来自分类Dev

C ++ 11无锁单一生产者单一消费者:如何避免繁忙等待

来自分类Dev

C ++ 11无锁单一生产者单一消费者:如何避免繁忙等待

来自分类Dev

C# 生产者/消费者设置,如果有 UI,消费者永远不会工作?

来自分类Dev

我如何确保生产者和消费者线程无限运行,一个接一个?

来自分类Dev

我可以将一个开发者帐户与多个AdMob帐户一起使用吗?

来自分类Dev

InOut是否将外出消息反馈给消费者或生产者?

来自分类Dev

RabbitMQ - 将数据发送给另一个消费者

来自分类Dev

C#多生产者/多层多消费者丢失数据

来自分类Dev

简单的生产者-消费者示例C#词典

Related 相关文章

  1. 1

    RabbitMQ:仅使用一个队列服务器时,将各个消费者/生产者捆绑在一起

  2. 2

    与一个生产者和多个消费者一起使用Queue是否安全?

  3. 3

    将芹菜的消费者和生产者分开

  4. 4

    C-Pthreads,一个使用者,多个生产者同步

  5. 5

    C:生产者/消费者

  6. 6

    C:生产者/消费者

  7. 7

    具有一个生产者和多个消费者的生产者-消费者

  8. 8

    如何在activeMQ中使用多个生产者和一个消费者?

  9. 9

    一个生产者,多个消费者

  10. 10

    将BufferBlock与限制选项一起使用给消费者

  11. 11

    生产者/消费者-生产者将数据添加到集合中而不会阻塞,消费者批量使用集合中的数据

  12. 12

    使用4.0框架类和Blocking Collection的C#中的生产者/混合消费者

  13. 13

    C#等待生产者/消费者中的多个事件

  14. 14

    将Kafka生产者和消费者整合到Web应用程序中

  15. 15

    一个状态对象的一个生产者多个消费者

  16. 16

    生产者-消费者在 C 中使用信号量

  17. 17

    一个快速生产者多个慢速消费者的最佳方案是什么?

  18. 18

    一个生产者多个消费者表现

  19. 19

    生产者/消费者:一个生产者,多个消费者,每个都处理相同的数据

  20. 20

    生产者/消费者:一个生产者,多个消费者,每个都处理相同的数据

  21. 21

    C ++ 11无锁单一生产者单一消费者:如何避免繁忙等待

  22. 22

    C ++ 11无锁单一生产者单一消费者:如何避免繁忙等待

  23. 23

    C# 生产者/消费者设置,如果有 UI,消费者永远不会工作?

  24. 24

    我如何确保生产者和消费者线程无限运行,一个接一个?

  25. 25

    我可以将一个开发者帐户与多个AdMob帐户一起使用吗?

  26. 26

    InOut是否将外出消息反馈给消费者或生产者?

  27. 27

    RabbitMQ - 将数据发送给另一个消费者

  28. 28

    C#多生产者/多层多消费者丢失数据

  29. 29

    简单的生产者-消费者示例C#词典

热门标签

归档