C#Integer / Float线程安全和Interlocked.Increment / CompareExchage

时间:2012-12-10 08:35:47

标签: c#

从许多线程,如this之一,我发现C#int / float是线程安全的。但我看到很多开发人员使用Interlocked.Increment / CompareExchage进行多线程应用程序。任何人都可以告诉我使用这些结构的原因。 更新:我知道这些结构。我只是想问一下,如果int是线程安全的,为什么我们需要这些结构呢?

2 个答案:

答案 0 :(得分:1)

  

任何人都可以告诉我使用这些结构的原因。

它不是关于读/写的线程安全性。但是关于COMPLETE操作的线程安全性。

读取增量,加1,写入。互锁,保证在一个“交易”中发生。与比较/交换相同。

如果你没有用某种锁定来编写它,那么你可能会在操作之间被打断。

读 Inrecement 写

这三个步骤中的每一步都是原子的,但不是组合。当你回写时,其他人可能已经改变了这个值 - interlocked确保了WHOLE操作是原子的。

答案 1 :(得分:1)

如上所述,你可能想要谷歌搜索。

然而,回答“为什么要使用InterlockedIncrement(& c。)?”的问题,虽然你总是可以执行一个int的简单访问,但保证不会返回任何半写的内容,您不能保证“读取和修改”操作(如增量)将按预期执行。

InterlockedIncrement及其同类,都保证操作将以原子方式执行 - 因此在InterlockedIncrement本身的情况下,如果两个线程都在同一个int上调用它,那么int保证以正确的值递增两次被返回到调用线程。但是,做一个简单的'i ++;'在两个线程上同时(对于相同的'i')可能导致读取的值不正确。

这是因为诸如'i ++'之类的增量被分解为至少两个机器指令:“读取值”和“增加值”(或者可能更糟:“读取”,“增加本地值”,“写”)。如果两个线程在完全相同的时间执行此操作,则它们可能都读取值0,但递增的值可能最终为2。