2012-06-09 22 views
12

Al leer el borrador de C++ 11 n3242, sección 20.7.2.5, parece que tenemos operaciones atómicas en shared_ptr, lo que nos permite hacer lock-free en estructuras complicadas sin preocuparnos por GC /pérdida de memoria.operaciones atómicas para shared_ptr en C++ 11

Sin embargo, no pude usarlo con éxito en GCC-4.7.0. Simplemente probado el siguiente programa

#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); 
} 

y tiene error del compilador:

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

¿Alguien sabe lo que me perdí aquí? ¿O simplemente es que gcc no ha implementado eso todavía?

+0

El contador de referencias internas 'shared_ptr <>' se incrementará y disminuirá atómicamente sin escribir ningún especial. ¿Qué intentas hacer con 'atomic_load' exactamente ...? – ildjarn

+0

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

+0

@ildjarn Si los hilos están cambiando a qué apunta una variable shared_ptr, debe evitar carreras de datos al acceder al shared_ptr en sí. – bames53

Respuesta

2

Parece que todavía no está en libstdC++.

Tampoco hay en libC++

VS11 beta tiene. Creo que esto es lo primero que encontré en la biblioteca de VS11 que no estaba en libC++.

+0

¿tiene alguna idea de cuándo esto podría ser implementado por GCC? –

+0

No, no tengo idea ... – bames53

+0

No tengo VS11 de mi mano, así que tengo curiosidad de cómo VS11 implementa atomic_load/atomic_store/atomic_compare_and_exchange. ¿Se implementa mediante bloqueo de giro? –

3

hay una propuesta para despreciar estos métodos atomic_store/atomic_load para shared_ptr a favor de la nueva clase atomic_shared_ptr: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4162.pdf

Así que para cuando se obtiene una versión libstC++ con atomic_load puede muy bien contener los nuevos punteros atómicas ya, que son mejores en varios aspectos.

MSVC STL ha implementado estos métodos hace un tiempo, y libC++ también exige el cumplimiento completo de C++ 11/14, por lo que deben estar disponibles en sus últimas versiones.

-6

Use clang ++ with -std = C++ 11 para compilar el código que debería hacerlo funcionar.

Cuestiones relacionadas