3

複数のスレッドで操作できる高性能クラスを維持しています。フィールドの多くは揮発性のintであり、結局のところ、そのうちの1つをdoubleにアップグレードする必要があります。これを行うためのロックフリーの方法があるかどうか知りたいのですがInterlocked.CompareExchange(double, double, double)、32ビットOSでアドバタイズされたとおりに動作するのか、それとも破れるのか、問題が発生するのではないかと考えていました。

4

3 に答える 3

2

このページでは、「ネイティブ」インターロック機能の本質について詳しく説明します。以下の制限について言及しています

_InterlockedCompareExchange64はcmpxchg8b命令を使用するため、486などのPentium以前のプロセッサでは使用できません。

したがって、(フルロックを使用してシミュレートするのではなく)インターロックされた命令操作として使用可能であり、実装されることも期待できます。

于 2009-12-17T16:40:16.200 に答える
1

はい、32ビットで説明されているように機能します。それがInterlockedメソッドの目的です。

于 2009-12-17T16:27:40.447 に答える
0

はい、動作します。

InterlockedCompareExchange64を使用します-x86asmで可能な実装を確認したい場合は、こちらをご覧ください-http: //qc.embarcadero.com/wc/qcmain.aspx ?d=6212 。

asm
//     ->          EAX     Destination 
//                 ESP+4   Exchange    
//                 ESP+12  Comperand   
//     <-          EDX:EAX Result      
          PUSH    EBX
          PUSH    EDI

          MOV     EDI, EAX

          MOV     EAX, DWORD PTR [Comperand]
          MOV     EDX, DWORD PTR [Comperand+4]

          MOV     EBX, DWORD PTR [Exchange]
          MOV     ECX, DWORD PTR [Exchange+4]

LOCK      CMPXCHG8B [EDI]

          POP     EDI
          POP     EBX
end;
于 2011-07-07T10:14:40.497 に答える