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

易失性与互锁与锁定

易失性与互锁与锁定

C#
POPMUISE 2019-06-26 14:59:29
易失性与互锁与锁定假设一个类有一个public int counter由多个线程访问的字段。这,这个int只会增加或减少。要增加这个字段,应该使用哪种方法,以及为什么?lock(this.locker) this.counter++;,Interlocked.Increment(ref this.counter);,更改counter到public volatile.现在我发现volatile,我一直在移走许多lock声明和使用Interlocked..但有理由不这么做吗?
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

正如在评论中提到的,这些天我很乐意使用Interlocked就a类案件而言单变量在那里显然好的。当事情变得更复杂的时候,我仍然会回到锁定.。

使用volatile当您需要增加时,不会有帮助-因为读和写是分开的指令。另一个线程可以在读完之后,在写回之前更改值。

就我个人而言,我几乎总是把锁起来-用这样的方式更容易得到正确的结果显然比波动或联锁更正确。就我而言,无锁多线程是真正的线程专家,而我不是其中之一。如果JoeDuffy和他的团队构建了一个很好的库,它可以并行化一些东西,而不像我构建的那样多锁,这太棒了,我会在心跳中使用它-但是当我自己做线程时,我尽量保持简单。


查看完整回答
反对 回复 2019-06-26
?
湖上湖

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

"volatile“不取代Interlocked.Increment!它只是确保变量不是缓存的,而是直接使用的。

递增变量实际上需要三个操作:

  1. 朗读,阅读
  2. 增量

Interlocked.Increment作为一个原子操作执行所有三个部分。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 313 浏览

添加回答

举报

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