从许多线程,如this之一,我发现C#int / float是线程安全的。但我看到很多开发人员使用Interlocked.Increment / CompareExchage进行多线程应用程序。任何人都可以告诉我使用这些结构的原因。 更新:我知道这些结构。我只是想问一下,如果int是线程安全的,为什么我们需要这些结构呢?
答案 0 :(得分:1)
任何人都可以告诉我使用这些结构的原因。
它不是关于读/写的线程安全性。但是关于COMPLETE操作的线程安全性。
读取增量,加1,写入。互锁,保证在一个“交易”中发生。与比较/交换相同。
如果你没有用某种锁定来编写它,那么你可能会在操作之间被打断。
读 Inrecement 写
这三个步骤中的每一步都是原子的,但不是组合。当你回写时,其他人可能已经改变了这个值 - interlocked确保了WHOLE操作是原子的。
答案 1 :(得分:1)
如上所述,你可能想要谷歌搜索。
然而,回答“为什么要使用InterlockedIncrement(& c。)?”的问题,虽然你总是可以执行一个int的简单访问,但保证不会返回任何半写的内容,您不能保证“读取和修改”操作(如增量)将按预期执行。
InterlockedIncrement及其同类,都保证操作将以原子方式执行 - 因此在InterlockedIncrement本身的情况下,如果两个线程都在同一个int上调用它,那么int保证以正确的值递增两次被返回到调用线程。但是,做一个简单的'i ++;'在两个线程上同时(对于相同的'i')可能导致读取的值不正确。
这是因为诸如'i ++'之类的增量被分解为至少两个机器指令:“读取值”和“增加值”(或者可能更糟:“读取”,“增加本地值”,“写”)。如果两个线程在完全相同的时间执行此操作,则它们可能都读取值0,但递增的值可能最终为2。