Equivalente interbloccato su Linux
-
02-07-2019 - |
Domanda
In un'app Linux C ++, qual è il modo più semplice per ottenere la funzionalità che Funzioni interbloccate su Win32 forniscono? In particolare, un modo leggero per aumentare o aggiungere atomicamente numeri interi a 32 o 64 bit?
Soluzione 7
Dopo un'ulteriore revisione, this sembra promettente. Yay stack overflow.
Altri suggerimenti
L'open source ThreadBuildingBlocks di Intel ha un modello, Atomic, che offre le stesse funzionalità della classe Interlocked di .NET .
A differenza dei Atomic integrati di gcc, è multipiattaforma e non dipende da un compilatore particolare. Come Nemanja Trifunovic sottolinea correttamente sopra, dipende dalle confronta-e-scambia istruzioni CPU fornite da x86 e chip Itanium. Immagino che non ti aspetteresti altro da una libreria Intel:)
Solo alcune note per chiarire il problema che non ha nulla a che fare con Linux .
Le operazioni?? RWM (lettura-modifica-scrittura) e quelle che non vengono eseguite in un solo passaggio richiedono il supporto hardware per eseguire atomicamente ; tra questi incrementi e decrementi, fetch_and_add, ecc.
Per alcune architetture (inclusi I386, AMD_64 e IA64) gcc ha un supporto integrato per l'accesso alla memoria atomica, quindi non è necessario alcun libray esterno. Qui puoi leggere alcune informazioni sull'API .
A rigor di termini, Linux non può offrire "interlocked" atomico funziona come quelli in Win32, semplicemente perché queste funzioni richiedono il supporto hardware e Linux funziona su alcune piattaforme che non offrono quel supporto. Detto questo, se puoi limitarti a Intel x86 / x64, dai un'occhiata all'implementazione del conteggio dei riferimenti nella libreria di puntatori condivisi Boost.
Le funzioni atomic di Apache Portable Runtime sono molto vicine alle funzioni Win32 InterlockedXXX.
È possibile inserire un codice assembly nella sorgente, per utilizzare direttamente le istruzioni interbloccate x68.
Dovresti usare un'operazione blocca xadd .
Vedi ad esempio questo .
La libreria glib abbastanza comune utilizzata nella programmazione GTK e QT e standalone offre una varietà di operazioni atomiche. Vedi http://library.gnome.org/devel/glib /2.16/glib-Atomic-Operations.html per un elenco. Esistono funzioni g_atomic
per la maggior parte delle operazioni supportate da Interlocked su Win32 e su piattaforme in cui l'hardware le supporta direttamente, sono incorporate come codice assembly necessario.