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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top