如何执行双重原子读取?
Posted
技术标签:
【中文标题】如何执行双重原子读取?【英文标题】:how to perform atomic read for double? 【发布时间】:2014-07-14 03:09:06 【问题描述】:为什么没有可用于 double 的 Interlocked.Read 函数,因为有可用于 double 的 Interlocked.Exchange 和 Interlocked.CompareExchange 方法,它们可以原子地执行更复杂的功能。使用此类方法以原子方式读取双精度值(而不是使用 Interlocked.Read)将增加简单读取操作的开销。
您能否建议一种更简单的方法来原子读取双精度,因为另一个线程正在使用 Interlocked.Exchange 方法更新此双精度。
【问题讨论】:
如果“另一个线程正在更新这个双精度”,您希望检索什么值?旧值还是新值? @MitchWheat,在当前线程的读操作执行之前,其他线程的更新操作不应该被阻塞吗? 想读取新值。 @Tony:发帖人似乎在快速要求一些东西。重读时我不知道他们在问什么! --> "...会给简单的读取操作增加开销" - 是的,锁定涉及开销... @MitchWheat 对问题的混淆感到抱歉。我的意思是与 Interlocked.Read 操作相比的开销。我正在创建一个临时变量并使用 Interlocked.Exchange 以原子方式读取双精度并返回临时值。一个简单的 Interlocked.Read 似乎比 Interlocked.Exchange 方法简单得多。有什么想法吗? 【参考方案1】:Interlocked.Read
为long
is implemented like this:
return Interlocked.CompareExchange(ref location,0,0);
这意味着使用CompareExchange
而不是Read
不会增加开销,long
和double
都不会。
【讨论】:
以上是关于如何执行双重原子读取?的主要内容,如果未能解决你的问题,请参考以下文章