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