2009-04-30 16 views

答えて

2

ない理由はない、それは完全に一般的な目的ではないのですが。

アトミックであることが保証されます
  • 、すなわち、スレッドセーフ。あなたはおそらくこれをほとんど必要としません。
  • Interlocked.Exchangeは参照型でのみ機能します。int、long、IntPtr、float、doubleのさまざまなオーバーロードがあります。
+0

2つの構造体を変更したい場合はどうすればよいですか? –

+2

2つの構造体をアトミックにスワップする場合は、lock(...)で囲まれた通常のスワップルーチン(Interlocked.Exchangeではなく)を使用します。 –

+0

スワップ(a、b) - > t = a、a = b、b = t:3トランザクション。インターロックスワップ(a、b) - >インターロックエクスチェンジ(a、インターロックエクステンション(b、a))を使用します。まだ分​​割できる2つの操作であるため、問題は解決されません。 –

1

私はあなた自身のスワップ方法にこれを好むでしょう。

Interlocked.Exchangeは、原子的に交換を処理する方法を提供します。基本的にInterlockedExchangedPointerの管理対象ラッパーです。

これは、少なくともスレッド化された状況では、独自のスワップ方式に比べて多くの利点があります。これは単一のアトミック操作であるため、スレッド化されたアプリケーションではるかに安全です。

1

単純なスワップ操作には使用しないでください。メモリへのアクセスをシリアル化し、おそらくCPUキャッシュを無効にしてCPUを停止させるためです。並行性を管理する必要がある場合は、.NETでのスワップよりも優れた方法があります。

+0

ありがとう、あなたはもっと良い方法を知っていますか? –

+0

私はMonitorクラスを知っています。シンプルスワップについて...一時的な使用に何が問題なのですか? :P – artificialidiot

1

スワップ(B) - > T =、= B、B = T:3つのトランザクション連動スワップ(B)を用い

分割することができる - > interlockedExchange(interlockedExhcangeを( b、a)); 分割可能な2つの操作であるため、問題は解決されません。

インターロックされたスワップを取得する最善の方法は、ステップが分割されないようにするために重要なセクションを置くことです。これで、別の方法を探し

、Tはペア<た場合、B>、あなたが交換された値を持つ新しいペアを構築した後、TのinterlockedExchangeを使用することができます - しかしに交換するペアを構築するための行動他の誰かがスワップしている場合はデータの折れ曲がりが発生したり、交換をしようとすると既にスワップされている可能性があります。したがって、ステップが分割されないように、重要なセクションが必要です。

+0

私は何かを見逃しましたか? AFAICT @ Joanは並行性やアトミック性の必要性について何も言わなかった。それは "意図されたスワップ方法"に暗黙のうちですか? – LarsH

+0

それは私がそれを読む方法 - 連動関数は、これをすべて一度に行うことを暗示しています。そうでなければ、インターロックド・エクスチェンジとスワップの間の質問の関係は、既に交換されているので実際のスワップを実行していないとは確信していません。 –

6

Interlocked.Exchangeは引数を入れ替えません。最初の引数だけが変更され、2番目の引数は変更されません。 「交換」とは、最初の引数の新しい値を古い値と交換することを指します。

これは、スワップ機能にとって非常に貧弱な選択です。

関連する問題