是Interlocked.Exchange <t>来自Microsoft的预期Swap方法吗?</t>

时间:2009-04-30 16:35:23

标签: c# .net

那么我们不需要实现自己的Swap方法吗?是Interlocked.Exchange来自Microsoft的预期Swap方法吗?

5 个答案:

答案 0 :(得分:6)

Interlocked.Exchange不会交换其参数。只更改了第一个参数,而不是第二个参数。 “交换”指的是为其旧值交换第一个参数的新值。

这使得交换功能的选择非常糟糕。

答案 1 :(得分:2)

没有理由不这样做,虽然它不是完全通用的目的:

  • 保证是原子的,即线程安全的;你可能大部分时间都不需要这个。
  • Interlocked.Exchange仅适用于引用类型:int,long,IntPtr,float和double有不同的重载。

答案 2 :(得分:1)

我更喜欢这个你自己的Swap方法。

Interlocked.Exchange提供了一种以原子方式处理交换的方法。它基本上是InterlockedExchangedPointer的托管包装器。

使用它比使用自己的交换方法有很多优点,至少在线程情况下如此。由于这是一个单独的原子操作,因此在线程应用程序中更安全。

答案 3 :(得分:1)

不要将它用于简单的交换操作,因为它将序列化对内存的访问,可能使cpu缓存无效并使cpu停顿。如果您需要管理并发性,那么有更好的方法来实现它而不是.NET中的交换。

答案 4 :(得分:1)

交换(a,b) - &gt; t = a,a = b,b = t:3个可以拆分的交易

使用互锁交换(a,b) - &gt; interlockedExchange(a,interlockedExhcange(b,a)); 问题没有解决,因为它仍然是可以拆分的2个操作。

目前看来,获得interlockedSwap的最佳方法是放置一个关键部分,以确保步骤不会分裂。

以不同的方式看待这个,如果T是一对&lt; a,b&gt;,您可以使用交换的值构造一个新的对,然后使用T的interlockedExchange - 但是如果其他人正在交换,或者在您交换时已经交换了构建交换对的操作可能会遭受数据剪切尝试做交换。因此,您需要一个关键部分,以确保步骤不会分裂。