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?
2
A
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;
Questions connexes
- 1. long double vs double
- 2. soustraction d'entier double précision avec registres 32 bits (MIPS)
- 3. Échange de bits en C++ pour un double
- 4. Linq, double jointure gauche et double compte
- 5. C: un double par divisant une double sorties lnf
- 6. nombres double précision dans l'assemblage en ligne (GCC, IA-32)
- 7. Double Precision
- 8. Double-colonnades dans ASP.NET
- 9. Double-Taper dans UIButton
- 10. Double plusses dans regex
- 11. Double importation dans grok
- 12. Ajout double dans Xquery
- 13. regex double numéro
- 14. Formulaire Double publication numéro
- 15. Double connexion PHP System
- 16. Eviter la double-cliquez sur la double tir d'une commande
- 17. Java Panel Double Buffering
- 18. boost :: numeric :: ublas :: vector <double> et double []
- 19. Border Double avec un VisualBrush dans WPF
- 20. erreur: opérandes invalides à% binaire (ont 'double' et 'double')
- 21. Spécifier un DateTime, Double PointPairList?
- 22. Les types double * et double ** sont-ils blittables? C#
- 23. C# List <double> size vs double [] size
- 24. L'équipement double en utilisant des flotteurs?
- 25. Comment convertir une chaîne (contenant double max) en double
- 26. Double clic dans Cocoa OSX
- 27. hibernate double logging
- 28. NSTableView double-cliquer/renommer
- 29. Double-clic sur l'événement
- 30. Lignes en double dans Oracle
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/). –