我可以在锁定语句中使用Interlocked.Increment吗?

时间:2013-10-09 11:11:41

标签: c# multithreading

我可以像我在当前代码中描述的那样使用它吗?

private void Increment() {
    lock(LockObject) {      
         // edit
         // ListOfObjects.Add(someInfo);
         // new edit ---> here
         ListOfObjects.Add(new SomeInfoObject() {
             Account = Interlocked.Increment(ref result),
             // ... other properties
         }
         // Interlocked.Increment(ref result);
    }
}

3 个答案:

答案 0 :(得分:3)

使用Interlocked类时,

不需要锁定。

MSDN说,

增加指定变量并将结果存储为原子操作

答案 1 :(得分:3)

是的,你可以,但没有理由这样做。 lockinterlocked操作只有在所有相关方同意的情况下才有效。如果一个线程使用lock,期望在持有锁时没有任何变化,而另一个线程使用ICX,那么ICX线程刚刚违反了第一个线程的假设。如果两个线程同意使用lock,那么在lock内使用ICX是值得怀疑的。单一陈述lock所有这一切都是ICX非常不寻常。

您需要发布更详细的代码说明,解释您尝试解决的实际问题。

答案 2 :(得分:1)

可以使用它,但在这种情况下是冗余,因为lock阻止了其他任何内容。

请查看this post了解详情。

---编辑---

好的,我看到您编辑了问题,以便向lock块添加内容。

在这种情况下,保护其他操作是有意义的,但 是否有意义将Interlocked.Increment置于lock块中取决于您正在尝试完成。

你能提供更多背景吗?