2012-08-09 11 views
6

Estoy tratando de portar algunos códigos Java a Windows C++ y estoy confundido acerca de cómo implementar AtomicLong.lazySet(). La única información que puedo encontrar habla sobre qué hace pero no cómo implementarla, y el código fuente disponible termina en una biblioteca nativa privada propiedad de Sun (sun.misc.Unsafe.class).puerto C++ de AtomicLong.lazySet

Actualmente solo establezco una variable miembro para el parámetro pasado, pero no estoy seguro de si es correcto.

class AtomicLong 
{ 
public: 
    inline void LazySet(__int64 aValue) 
    { 
     // TODO: Is this correct? 
     iValue = aValue; 
    } 

    inline void Set(__int64 aValue) 
    { 
     ::InterlockedExchange64(&iValue, aValue); 
    } 

private: 
    __declspec(align(64)) volatile __int64 iValue; 
}; 

No puedo usar boost.

Edit: Estoy compilando a x64 pero quizás las soluciones para el código de 32 bits serían de ayuda para otros.

No tengo acceso a C++ 11.

+4

* '// TODO: ¿Es esto correcto' * Creo que es correcto en sistemas de 64 bits? , pero no los sistemas de 32 bits. – Mehrdad

+0

¿Has probado [OpenJDK] (http://openjdk.java.net/) fuentes? Reemplazó la mayoría (¿todos?) Del código propietario de Sun con componentes de código abierto, tal vez usted puede tener un pico en su implementación de AtomicLong y sus bibliotecas nativas. –

Respuesta

2

C++ 11 contiene una biblioteca atómica, y es fácil si se puede usar:

class AtomicLong 
{ 
public: 
    inline void LazySet(int64_t aValue) 
    { 
     iValue.store(aValue, std::memory_order_relaxed); 
    } 
    inline void Set(int64_t aValue) 
    { 
     iValue.store(aValue); 
    } 
private: 
    std::atomic<int64_t> iValue; 
}; 
+0

Gracias, sin embargo, VC++ 2010 no es compatible con C++ 11. ¿Qué código genera 'iValue.store' en LazySet? – James

Cuestiones relacionadas