我正在寻找一个线程安全的计数器实现,它使用Interlocked
支持任意值递增的方式,并直接从Interlocked.CompareExchange
文档中找到了这个示例(为简单起见稍作更改):
private int totalValue = 0;
public int AddToTotal(int addend)
{
int initialValue, computedValue;
do
{
// How can we get away with not using a volatile read of totalValue here?
// Shouldn't we use CompareExchange(ref TotalValue, 0, 0)
// or Thread.VolatileRead
// or declare totalValue to be volatile?
initialValue = totalValue;
computedValue = initialValue + addend;
} while (initialValue != Interlocked.CompareExchange(
ref totalValue, computedValue, initialValue));
return computedValue;
}
public int Total
{
// This looks *really* dodgy too, but isn't
// the target of my question.
get { return totalValue; }
}
我知道这段代码试图做什么,但我不确定在分配给添加到的临时变量时如何不使用共享变量的易失性读取。
是否有机会initialValue
在整个循环中保持陈旧的值,使函数永远不会返回?或者内存屏障(?)CompareExchange
是否消除了任何这种可能性?任何见解将不胜感激。
编辑:我应该澄清一下,如果CompareExchange
导致后续读取在上次totalValue
调用时是最新的,那么这段代码就可以了。但这能保证吗? CompareExchange