Come eseguire 64b atomica leggere su x86 (Pentium e sopra)?
Domanda
Vorrei eseguire e una lettura atomica di 64b allineati 64b dati sulla piattaforma x86 (Pentium o superiore garantito).
C'è un modo per fare questo? (E no, io non voglio usare una sezione critica o di un mutex per questo, io voglio che questo sia senza blocchi).
Soluzione
Utilizzare le operazioni Interlocked, ecco alcuni esempi di codice:
LONGLONG AtomicRead(LONGLONG* p)
{
return InterlockedCompareExchange64(p, 0, 0);
}
Questo fa lo scambio confrontare con lo zero e imposta p a zero se è già pari a -cioè a zero, si tratta di un noop. InterlockedCompareExchange restituisce il valore originale a 64 bit puntato da p.
Altri suggerimenti
Questa pagina descrive come farlo. In pratica dovete solo usare lock cmpxchg8b
.
Utilizza l'Interlocked * () funzioni.
Non c'è lettura di per sé -. Ma si può emettere un add () in cui si aggiunge 0