2009-04-24 11 views
3

Je voudrais effectuer et lecture atomique des données 64b alignées 64b sur la plate-forme x86 (Pentium ou au-dessus garanti).Comment effectuer une lecture atomique 64b sur x86 (Pentium et supérieur)?

Existe-t-il un moyen de le faire? (Et non, je ne veux pas utiliser une section critique ou un mutex pour cela, je veux que ce soit sans verrou).

+0

veuillez confirmer - voulez-vous dire 64 bits, ou octets? – Alnitak

+1

Je suppose que c'est 64 bits. Les octets n'auraient pas vraiment de sens. – Zifre

+0

La question serait meilleure si elle mentionnait Windows dans le texte au lieu de simplement avoir la balise win32. Je vois les tags comme favorisant les recherches, pas les informations en elles-mêmes. –

Répondre

4

Utilisez les opérations Interlocked, voici quelques exemples de code:

LONGLONG AtomicRead(LONGLONG* p) 
{ 
    return InterlockedCompareExchange64(p, 0, 0); 
} 

Cela ne le comparer échange contre zéro et fixe p à zéro si elle est déjà égal à zéro -ie, il est un noop. InterlockedCompareExchange renvoie la valeur 64 bits d'origine pointée par p.

+0

InterlockedAdd() ajoutant 0 est mieux - CAS a plus de travail à faire et utilise plus de cycles. –

+1

Selon MSDN InterlockedAdd est uniquement pris en charge sur Itanium. Même sur x86, l'ajout de verrou n'est qu'une lecture 32 bits. – Michael

+0

Je veux dire, InterlockedAdd64. – Michael

0

Utilisez les fonctions Interlocked *().

Il n'y a pas de lecture en soi - mais vous pouvez émettre un Ajouter() où vous ajoutez 0.

+1

Pourquoi supposez-vous qu'il utilise Windows? – Zifre

+0

Il n'y a pas d'interlocked Ajouter, Or/Xor sur x86, seulement _InterlockedCompareExchange64 - voir la réponse par Zifre – Suma

+1

La question est actuellement marquée comme "win32", donc je pense qu'il est sûr de supposer que les fonctions de Windows sont acceptables. –

6

This page décrit comment le faire. Fondamentalement, il suffit d'utiliser lock cmpxchg8b.

+0

C++, pas asm - il veut les wrappers fournis par le système d'exploitation. –

+1

@Blank Xavier, pourquoi penses-tu qu'il veut des wrappers fournis par OS? Et comment savez-vous quel système d'exploitation il utilise? – Zifre

+0

Balise C++. Je ne connais pas l'OS, donc ma suggestion Interlocked *() peut ne pas lui être utile. –