如果 Interlocked.Increment 是原子的,为啥我应该使用 ++ 代替?

Posted

技术标签:

【中文标题】如果 Interlocked.Increment 是原子的,为啥我应该使用 ++ 代替?【英文标题】:If Interlocked.Increment is atomic, why should I ever use ++ instead?如果 Interlocked.Increment 是原子的,为什么我应该使用 ++ 代替? 【发布时间】:2011-05-23 13:40:18 【问题描述】:

我认为这个原子操作比++ 快。我只看到有利于Interlocked.Increment 的优势。它的缺点是什么?

【问题讨论】:

为什么你认为它比++更快? 你不会做单线程编程吗? 这里已经回答了这个问题:***.com/questions/1034070/… @Lasse 因为我认为它是在单个 CPU 周期或等效周期内执行的。 【参考方案1】:

Atomic 意味着它是线程安全的(即一个线程不可能在另一个线程更改值时读取该值。)由于需要使用线程同步机制,这使得它变得更慢,而不是更快。如果你不关心线程安全,你想使用 ++。 Here 是一些关于 ++ 运算符在不同上下文中的相对性能的讨论。

【讨论】:

我刚刚测试过,1e8 次++ 大约是一秒,同样数量的Interlocked.Increment 操作这次在我的电脑上使用了两倍以上。 没错。你的结果与理论一致。【参考方案2】:

原子并不意味着它更快。事实上,它几乎肯定会更慢。

在并发编程中,一个 操作(或一组操作)是 原子的、可线性化的、不可分割的或 不间断,如果它出现在 系统的其余部分发生 瞬间。

这仅仅意味着在操作过程中没有可观察到的副作用。它没有说明手术需要多长时间。

【讨论】:

以上是关于如果 Interlocked.Increment 是原子的,为啥我应该使用 ++ 代替?的主要内容,如果未能解决你的问题,请参考以下文章

C#原子操作(Interlocked.Decrement和Interlocked.Increment)

Interlocked.Increment 溢出会导致 .NET 运行时损坏吗?

使用Interlocked.Increment的C#对象池

SQL Server 中的 NEXT VALUE FOR @Sequence 的工作方式是不是与 C# 中的 Interlocked.Increment() 相同? [复制]

信号灯 ManualResetEvent 与 Interlocked.Increment 原子操作使

Interlocked