2009-12-17 3 views
2

Je maintiens une classe de haute performance qui peut être exploitée par plusieurs threads. Beaucoup de champs sont ints volatils, et comme il s'avère que j'ai besoin de mettre à niveau un de ceux-ci à un double. Je suis curieux de savoir s'il existe un moyen sans verrou de le faire, et je me demandais si le Interlocked.CompareExchange(double, double, double) fonctionne comme annoncé sur un système d'exploitation 32 bits, ou sont déchirés lit un problème.Interlocked.CompareExchange (double, double, double) fonctionne-t-il dans un système d'exploitation 32 bits?

Répondre

1

This page détaille l'intrinsèque des fonctions "natives" verrouillées. Il mentionne les limites suivantes

Parce que _InterlockedCompareExchange64 utilise l'instruction CMPXCHG8B, il est disponible sur les processeurs pré-Pentium, comme le 486.

Nous pouvons nous attendre à ce qu'il est disponible et également mis en œuvre en tant opération d'instruction interverrouillée (plutôt que d'être simulée en utilisant un verrou complet).

1

Oui, cela fonctionne comme décrit sur 32 bits. C'est ce que les méthodes Interlocked sont là pour.

0

Oui, ça marche.

Il utilise InterlockedCompareExchange64 - si vous voulez jeter un oeil à une implémentation possible dans x86 asm, regardez ici - 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; 
+0

Notez que [QualityCentral a été arrêté] (https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward), de sorte que vous ne pouvez pas accéder 'qc.embarcadero .com' liens plus. Si vous avez besoin d'accéder aux anciennes données de QC, regardez [QCScraper] (http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/). –