首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Interlocked.CompareExchange不能工作?

为什么Interlocked.CompareExchange不能工作?
EN

Stack Overflow用户
提问于 2020-04-24 12:54:48
回答 1查看 528关注 0票数 1
代码语言:javascript
复制
if (Interlocked.CompareExchange(ref this.popcount, this.popcount + 1, this.popcount) == this.popcount)
{
    pop = Interlocked.CompareExchange(ref head, head.next, head);
}

我写了一段代码,但不知怎么的,它不是我想要的.

代码语言:javascript
复制
Interlocked.CompareExchange(ref this.popcount, this.popcount + 1, this.popcount)

我认为这意味着

popcount

  • compare

  • 转到this.popcount引用并获得this.popcount

  • if值的值--这是相同的,向this.popcount

添加1

我说错了吗?如果我错了,我怎么纠正呢?

EN

回答 1

Stack Overflow用户

发布于 2020-04-24 14:01:16

您需要记住添加了1的值,即“前面”的值,并且不能依赖于(重新)从将要更改的变量中读取它。因为关键是多个线程正在竞争更新这个变量的值。所以你想要的是:

代码语言:javascript
复制
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将更合适。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61408856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档