if (Interlocked.CompareExchange(ref this.popcount, this.popcount + 1, this.popcount) == this.popcount)
{
pop = Interlocked.CompareExchange(ref head, head.next, head);
}我写了一段代码,但不知怎么的,它不是我想要的.
Interlocked.CompareExchange(ref this.popcount, this.popcount + 1, this.popcount)我认为这意味着
popcount
this.popcount引用并获得this.popcount
this.popcount添加1
我说错了吗?如果我错了,我怎么纠正呢?
发布于 2020-04-24 14:01:16
您需要记住添加了1的值,即“前面”的值,并且不能依赖于(重新)从将要更改的变量中读取它。因为关键是多个线程正在竞争更新这个变量的值。所以你想要的是:
var oldcount = this.popcount;
var newcount = oldcount + 1;
if(Interlocked.CompareExchange(ref this.popcount, newcount, oldcount) == oldcount)
{
//It worked
}
else
{
//Loop round, try again, whatever you plan to do when you don't succeed.
}使用您的示例,即使CompareExchange成功了,您也会将旧值(由CompareExchange返回)与新值(您刚刚通过this.popcount读取到的==右边的值)进行比较,这些值不太可能匹配。相反,如果您对CompareExchange的调用实际失败,则它们可能是相等的。
当然,如果您只是在增量一个变量,Interlocked.Increment将更合适。
https://stackoverflow.com/questions/61408856
复制相似问题