2012-06-09 20 views
12

Leggendo la bozza di C++ 11 n3242, sezione 20.7.2.5, sembra che abbiamo operazioni atomiche su shared_ptr, che ci consente di eseguire il lock-free su una struttura complicata senza preoccuparci di GC /perdita di memoria.operazioni atomiche per shared_ptr in C++ 11

Tuttavia, non è stato possibile utilizzarlo correttamente in GCC-4.7.0. Ho semplicemente provato il seguente programma

#include <atomic> 
#include <memory> 
#include <string> 

struct X { 
    int x; 
    double y; 
    std::string s; 
}; 

int main() { 
    std::shared_ptr<X> x(new X); 
    auto p = std::atomic_load(&x); 
} 

e ha errore di compilazione:

c.cpp:13:33: error: no matching function for call to ‘atomic_load(std::shared_ptr<X>*)’ 

Qualcuno sa quello che ho perso qui? O semplicemente gcc non l'ha ancora implementato?

+0

Il conteggio dei riferimenti interni 'shared_ptr <>' verrà incrementato e decrementato atomicamente senza scrivere alcuno speciale. Cosa stai cercando di fare con 'atomic_load' esattamente ..? – ildjarn

+0

@ildjarn, leggi questo http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm –

+0

@ildjarn Se i thread stanno cambiando ciò che una variabile shared_ptr punta a te devi evitare dati razze quando si accede alla shared_ptr stessa. – bames53

risposta

2

Sembra che non sia ancora in libstdC++.

Non è anche in libC++

VS11 beta ha. Penso che questa sia la prima cosa che ho trovato nella libreria di VS11 che non era in libC++.

+0

hai qualche idea quando questo potrebbe essere implementato da GCC? –

+0

No, nessuna idea .... – bames53

+0

Non ho VS11 dalla mia mano quindi sono curioso di sapere come VS11 implementa atomic_load/atomic_store/atomic_compare_and_exchange. È implementato tramite spin lock? –

3

C'è una proposta per deprecare questi metodi atomic_store/atomic_load per shared_ptr a favore della nuova classe atomic_shared_ptr: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4162.pdf

Così, il tempo si ottiene una versione libstC++ con atomic_load può benissimo contenere i nuovi puntatori atomiche già, che sono migliori in diversi aspetti.

MSVC STL ha implementato questi metodi qualche tempo fa e libC++ rivendica anche la piena conformità a C++ 11/14, quindi devono essere disponibili nelle sue ultime versioni.

-6

Utilizzare clang ++ con -std = C++ 11 per compilare il codice che dovrebbe farlo funzionare.

Problemi correlati