没有合适的资源?快使用搜索试试~ 我知道了~
c#高效的线程安全队列ConcurrentQueueT的实现
51 下载量 133 浏览量
2021-01-19
23:26:51
上传
评论 3
收藏 217KB PDF 举报
温馨提示
试读
3页
入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。 一、ConcurrentQueue内部结构: 1.实现原理 众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2.使用链表实现的队列。 先看看两种方式的优劣: .Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会进行扩容,扩容的主要实现是开辟一个原始长度2倍的新数组,然后将原始数组里面的数据复制到新数组中,所以当扩容时就会产生不小的内存开销,在并发的环境中对性能的影响不可小视。当然在调用Q
资源推荐
资源详情
资源评论
c#高效的线程安全队列高效的线程安全队列ConcurrentQueueT的实现的实现
入队(EnQueue) 、出队(TryDequeue) 、是否为空(IsEmpty)、获取队列内元素数量(Count)。
一、一、ConcurrentQueue内部结构内部结构:
1.实现原理实现原理
众所周知,在普通的非线程安全队列有两种实现方式:
1.使用数组实现的循环队列。
2.使用链表实现的队列。
先看看两种方式的优劣:
.Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会进行扩容,扩容的主要实现是开
辟一个原始长度2倍的新数组,然后将原始数组里面的数据复制到新数组中,所以当扩容时就会产生不小的内存开销,在并发
的环境中对性能的影响不可小视。当然在调用Queue的构造函数时可以指定默认空间的大小,但是一般情况下数据量是不可预
测的,选大了会照成空间浪费,选小了会有复制内存的开销,而且队列扩容以后需要显示调用TrimToSize()方法才能回收掉不
使用的内存空间。
第二种链表实现方式虽然消除了空间浪费的问题但是又增加了GC的压力,当入队时会分配一个新节点,出队时要对该节点
进行废弃,对于大量的出队入队操作时该实现方式性能不高。
综合以上两种实现方式,在支持多线程并发出队并发入队的情况下,ConcurrentQueue使用了分段存储的概念(如上图所
示),ConcurrentQueue分配内存时以段(Segment)为单位,一个段内部含有一个默认长度为32的数组和执行下一个段的指
针,有个和Head和Tail指针分别指向了起始段和结束段(这种结构有点像操作系统的段式内存管理和页式内存管理策略)。这
种分配内存的实现方式不但减轻的GC的压力而且调用者也不用显示的调用TrimToSize()方法回收内存(在某段内存为空时,
会由GC来回收该段内存)。
2.Segment(段段)内部结构内部结构
其实对于ConcurrentQueue的操作其实就是对Segment(数据段)的操作。
Segment可抽象出如下数据结构:
Segment内部主要方法:
资源评论
weixin_38522214
- 粉丝: 2
- 资源: 880
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功