3

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

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);
    }
}
4

3 回答 3

3

是的,你可以,但应该没有理由这样做。只有当所有相关方都同意这样做时,两者lock和操作才能起作用。interlocked如果一个线程使用lock,期望在持有锁时没有任何变化,而另一个线程使用,ICX那么 ICX 线程就违反了第一个线程的假设。如果两个线程都同意使用lock,那么内部使用 ICXlock是有问题的。一个声明lock它所做的只是一个 ICX 是非常非常不寻常的。

您需要发布更详细的代码描述来解释您要解决的实际问题。

于 2013-10-09T11:17:37.300 回答
3

Interlocked使用类时不需要lock 。

MSDN 说,

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

于 2013-10-09T11:12:58.660 回答
1

可以使用它,但在这种情况下是多余的,因为该lock块没有保护任何其他内容。

看看这篇文章了解更多信息。

- - 编辑 - -

好的,我看到您编辑了问题以在lock块中添加一些内容。

在这种情况下,保护这个其他操作是有意义的,但是放在块内是否有意义取决于你想要完成的事情。Interlocked.Incrementlock

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

于 2013-10-09T11:17:46.243 回答