In base al Manuale per gli sviluppatori di software Intel 64 e IA-32 Architectures, il prefisso di segnale LOCK "assicura che il processore abbia l'uso esclusivo di qualsiasi memoria condivisa mentre il segnale viene asserito". Questo può essere un blocco sotto forma di bus o cache.Intel 64 e IA-32 | Operazioni atomiche inclusa acquisizione/rilascio semantica
Ma - e questo è il motivo per cui sto facendo questa domanda - non è chiaro per me, se questo prefisso fornisce anche una barriera di memoria.
Sto sviluppando con NASM in un ambiente multiprocessore e ho bisogno di implementare operazioni atomiche con acquisizioni opzionali e/o release semantiche.
Quindi, devo utilizzare le istruzioni di MFENCE, SFENCE e LFENCE o sarebbe ridondante?
Sì, lo so. Ma voglio usare (per esempio) un incremento interbloccato per segnalare che sto acquisendo una risorsa. Quindi, ho bisogno di usare "lfence" prima dell'incremento. Perché? Perché devo essere sicuro che tutte le operazioni di carico precedenti siano terminate prima di segnalare. – 0xbadf00d
No, non c'è bisogno di farlo, dovrebbe essere fatto atomicamente. Controlla la mia modifica sulle operazioni atomiche bloccate. –
Ma un'operazione atomica non ha nulla a che fare con il prioer o la memoria e le scritture seguite ?! Controlla questo blog: http://blogs.msdn.com/b/kangsu/archive/2007/07/16/volatile-acquire-release-memory-fences-and-vc2005.aspx – 0xbadf00d