Je veux utiliser InterlockedExchange à partir du Winapi pour utiliser une synchronisation sans verrouillage de threads.
Pour le moment, j'ai une classe comme celle-ci.
struct DataExchange { volatile LONG m_value; void SetValue(LONG newVal) { InterlockedExchange(&m_value, newVal); } LONG GetValue() { LONG workVal=0; InterlockedExchange(&workVal, m_value); return workVal; } };
4 Réponses :
Non, non, non que vous ne pouvez pas correspondre à votre structure en 32 bits, auquel cas vous pouvez continuer à utiliser InterlockedExchange. P>
Seulement si la structure est exactement 32 bits. p>
Une alternative consiste à utiliser un interlockedexchange sur un pointeur vers une structure. La structure doit être immuable (ou ne le change jamais). Pour mettre à jour la structure, en faire un nouveau, puis échangez le pointeur. Vous devez faire attention à la destruction de la structure pour vous assurer qu'elle ne se fait qu'une seule fois, et que si personne ne l'utilise. P>
@ Lou-Franco: Mais utiliser de nouvelles et supprimées serait contraire à mon objectif d'être aussi rapide que possible dans ce cas. Parce que le gestionnaire de tas fera également du verrouillage interne.
@mkaes: avez-vous mesuré? N'ignorez pas une méthode potentielle car elle pourrait présenter certains comportements - vous devriez vérifier. (J'ai également suggéré d'utiliser un pointeur dans un commentaire à votre question, et je pense que cela mérite d'être enquêté pour vous.)
Le meilleur que vous puissiez faire est d'utiliser InitializececriticalSectionDspincount & Code>
fonction qui n'attendra pas la serrure s'il est possible de prendre une appropriation assez rapide. P>
Vous pouvez obtenir une opération atomique sur une valeur de 64 bits en utilisant Interlockedexchange64 sur des plates-formes 64 bits et Windows Vista / 7. Cela suffirait à convenir à deux valeurs 32 bits Étant donné que la fonction est implémentée avec un instrument compliste, il appelle essentiellement une instruction d'assemblage dépendante de la plate-forme, comme int code> dans une structure. P>
CMPXCHG code> sur x86. Étant donné que cette instruction ne fonctionne qu'à un maximum (sur des plates-formes 64 bits) sur un opérande de source de registre 64 bits, un registre 64 bits ou une destination de mémoire de la mémoire, et le registre
rax code>, il n'y a qu'un seul Une valeur de taille unique Vous pouvez effectuer une opération atomique sur l'utilisation des instructions de montage unique sans incorporer un type de blocage ou de sémaphore pour créer une section critique. P>
L'utilisation d'un accès atomique sur la variable ne le rend pas sans le verrouillage, car l'accès atomique est également une très petite section critique, bien que mises en œuvre à la CPU.
Si vous voulez sans verrouillage, vous devez peut-être considérer cette URL: calvados.di.unipi.it/dokuwiki/doku.php?id=ffnamespace:About
LockFree est vraiment tort dans ce contexte. Mais c'est la synchronisation la plus rapide que je puisse utiliser sur une machine Windows. @sep +1 pour le lien sympa. Je vais regarder dès que j'ai un peu de temps
Raymond Chen ( L'ancienne nouvelle chose ) a écrit un peu sur ce sujet le mois dernier, par ex. algorithmes sans verrouillage: l'initialisation ponctuelle a>
Pas si le
struct code> est supérieur à 32 bits. Mais ce que vous pouvez faire est d'échanger un pointeur i> à un
struct code>.
Notez également que votre
getvalue code> corrompt la valeur ...