为了账号安全,请及时绑定邮箱和手机立即绑定

关于Segment<T>的实现

关于Segment<T>的实现

陪伴而非守候 2018-12-06 20:41:52
最近在研究ConcurrentQueue的实现,发现里面有个私有类Segment,拿Reflector看了下,其中有如下的代码: 1 internal List ToList(int start, int end) 2 { 3 List list = new List(); 4 for (int i = start; i
查看完整描述

9 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

第一个是反编译问题,正如上面的人所说。第二个问题详解看这里。简单来说就是因为这里是多线程环境,因此任何时候都有可能会引发ThreadAbortException,如果是在try块里那么某些代码不能保证被执行。而finally块则可以保证即使是发生了ThreadAbortException,这些代码也会被执行。这是一个小技巧,不过现在已经不适用了,更好的替代方式是Thread.BeginCritialRegeion。
查看完整回答
反对 回复 2018-12-09
?
慕容708150

TA贡献1831条经验 获得超4个赞

int在用户在建立字段的时候如果int?这个样子的话,那么int默认就是null。 至于为什么写在finally里面,我感觉没有什么意义。
查看完整回答
反对 回复 2018-12-09
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

你的反编译有问题吧: // System.Collections.Concurrent.ConcurrentQueue.Segment internal List ToList(int start, int end) { List list = new List(); for (int i = start; i <= end; i++) { SpinWait spinWait = default(SpinWait); while (this.m_state[i] == 0) { spinWait.SpinOnce(); } list.Add(this.m_array[i]); } return list; } try{}finally{} 有个很大的作用,就是保证 finally 块中的代码总是被执行,虽然这里 try 块里面没有任何代码,但是这种写法可以保证 Unhandled Exception 触发时,finally 块中的代码仍然会被执行。
查看完整回答
反对 回复 2018-12-09
?
不负相思意

TA贡献1777条经验 获得超10个赞

try里面没有任何代码的话,有什么可能性会触发Exception,反而是在finally里面放了那么多代码,要是引发Exception的话程序不就崩掉了?
查看完整回答
反对 回复 2018-12-09
?
临摹微笑

TA贡献1982条经验 获得超2个赞

@garry: MSDN对 finally 还有个解释,这里的直接原因不是多线程的问题,而是发生了 Unhandled Exception (这可能是 OS 异常)后,如何处理 finally 中代码块的问题,根据 OS 的设置,finally 中代码可能不会被执行。在 OS 看来,出现错误后会设置一个中断,CLR 根据中断的类型和位置做对应的处理,又或者无法处理直接卸载整个进程。
查看完整回答
反对 回复 2018-12-09
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

@Launcher: 非常感谢你的解释,总段弄明白了
查看完整回答
反对 回复 2018-12-09
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我也觉得是反编译问题,用dotpeek比较好
查看完整回答
反对 回复 2018-12-09
  • 9 回答
  • 0 关注
  • 500 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信