2012-08-09 20 views
6

Próbuję przenieść kod Java do systemu Windows C++ i jestem zdezorientowany, jak zaimplementować AtomicLong.lazySet(). Jedyne informacje, jakie mogę znaleźć, mówią o tym, co robi, ale nie o tym, jak je wdrożyć, a dostępny kod źródłowy kończy się w prywatnej bibliotece natywnej należącej do Sun (sun.misc.Unsafe.class).Port C++ AtomicLong.lazySet

Właśnie ustawiłem zmienną składową na przekazany parametr, ale nie jestem pewien, czy jest poprawny.

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

Nie mogę użyć zwiększenia.

Edycja: Łączę się z x64, ale być może rozwiązania dla 32-bitowego kodu będą pomocne dla innych.

Nie mam dostępu do C++ 11.

+4

* '// TODO: Czy to prawidłowe' * Myślę, że to poprawna w systemach 64-bitowych? , ale nie systemy 32-bitowe. – Mehrdad

+0

Czy próbowałeś źródeł [OpenJDK] (http://openjdk.java.net/) źródeł? Zastąpił on większość (wszystkich?) Zastrzeżonego kodu firmy Sun komponentami open-source, może uda ci się osiągnąć szczyt w implementacji biblioteki AtomicLong i jej natywnych bibliotek. –

Odpowiedz

2

C++ 11 zawiera bibliotekę atomowej, a to jest łatwe, jeśli można go używać:

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

Dzięki, jednak VC++ 2010 nie obsługuje C++ 11. Jaki kod generuje 'iValue.store' w LazySet? – James