2013-10-09 41 views
3

我可以像我在当前的代码中描述的那样使用它吗?我可以在锁定语句中使用Interlocked.Increment吗?

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); 
    } 
} 
+0

是的,你可以,但你不应该在这种情况下。你只会增加额外的开销。但是,当它是一个锁内的大部分代码的一部分时,没问题。 –

回答

3

当您使用Interlocked类时,不需要锁定。

MSDN说,

递增一个指定的变量,并将结果存储,作为一个原子操作

+3

这种类型取决于锁块内是否有其他东西,以及您锁定的内容。例如,用Interlocker.Increment增加一些与锁无关的东西是有意义的。 –

+0

是的,如果你在锁构造中有更多的语句,那么你可以做到这一点。从问题的角度来看,这不是必需的 –

3

是的,你可以,但应该没有理由去做。 lockinterlocked只有在所有相关方都同意的情况下才能使用。如果一个线程使用lock,期望没有任何东西可以更改,而另一个线程使用ICX,那么ICX线程刚刚违反了第一个线程的假设。如果两个线程同意使用lock,那么在lock内使用ICX是有问题的。一个声明lock,它所做的只是一个ICX是非常非常不寻常的。

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

1

可以使用它,但就是在这种情况下冗余,因为没有别的正在被lock块保护。

看看this post了解更多信息。

---编辑---

OK,我看你编辑的问题的东西添加到lock块。

在这种情况下,这是有道理的,以保护该其它的操作,但是否也有道理把Interlocked.Incrementlock块取决于你所要完成的任务。

你能提供更多的上下文吗?

+0

你的意思是什么? – IamStalker

+0

@IamStalker从本质上讲,代码的其他部分正在做什么,以及您要完成的最终目标是什么。 –

+0

只是为了知道这个锁定和原子操作在这种情况下使用? – IamStalker

相关问题