VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之C# ConcurrentBag的实现原理(2)

  • 完成以上操作以后,就可以使用UnfreezeBag()方法解冻整个集合。
  • 那么FreezeBag()方法是如何来冻结整个集合的呢?也是分为三步走。

    1. 首先获取全局锁,通过Monitor.Enter(GlobalListsLock, ref lockTaken);这样一条语句,这样其它线程就不能冻结集合。
    2. 然后获取所有线程中ThreadLocalList的锁,通过`AcquireAllLocks()方法来遍历获取。这样其它线程就不能对它进行操作损坏数据。
    3. 等待已经进入了操作流程线程结束,通过WaitAllOperations()方法来实现,该方法会遍历每一个ThreadLocalList对象的m_currentOp属性,确保全部处于None操作。

    完成以上流程后,那么就是真正的冻结了整个ConcurrentBag<T>集合,要解冻的话也类似。在此不再赘述。

    四、总结#

    下面给出一张图,描述了ConcurrentBag<T>是如何存储数据的。通过每个线程中的ThreadLocal来实现线程本地存储,每个线程中都有这样的结构,互不干扰。然后每个线程中的m_headList总是指向ConcurrentBag<T>的第一个列表,m_tailList指向最后一个列表。列表与列表之间通过m_locals 下的 m_nextList相连,构成一个单链表。

    数据存储在每个线程的m_locals中,通过Node类构成一个双向链表。 PS: 要注意m_tailListm_headList并不是存储在ThreadLocal中,而是所有的线程共享一份。

    1534581126728

    以上就是有关ConcurrentBag<T>类的实现,笔者的一些记录和解析。

    笔者水平有限,如果错误欢迎各位批评指正!

    附上ConcurrentBag<T>源码地址:戳一戳

    作者:InCerry

    出处:https://www.cnblogs.com/InCerry/p/9497729.html

    本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。


    
    相关教程
    关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号