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