2012-08-09 15 views
6

का सी ++ बंदरगाह मैं कुछ जावा कोड को विंडोज सी ++ पर बंद करने की कोशिश कर रहा हूं और AtomicLong.lazySet() को कार्यान्वित करने के बारे में उलझन में हूं। एकमात्र जानकारी जो मैं करता हूं उसके बारे में वार्ता पाती हूं लेकिन इसे कैसे कार्यान्वित नहीं किया जा सकता है, और उपलब्ध स्रोत कोड सूर्य (sun.misc.Unsafe.class) के स्वामित्व वाली निजी मूल लाइब्रेरी में समाप्त होता है।परमाणु Long.lazySet

मैं वर्तमान में पास पैरामीटर पर एक सदस्य चर सेट करता हूं लेकिन मुझे यकीन नहीं है कि यह सही है या नहीं।

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

मैं बूस्ट का उपयोग नहीं कर सकता।

संपादित करें: मैं x64 के लिए संकलित कर रहा हूं लेकिन 32-बिट कोड के लिए समाधान दूसरों के लिए मदद की जाएगी।

मुझे सी ++ 11 तक पहुंच नहीं है।

+4

* '// TODO: यह सही है' * मुझे लगता है कि 64-बिट सिस्टम पर सही है? , लेकिन 32-बिट सिस्टम नहीं। – Mehrdad

+0

क्या आपने [ओपनजेडीके] (http://openjdk.java.net/) स्रोतों का प्रयास किया है? यह ओपन-सोर्स घटकों के साथ सूर्य मालिकाना कोड के अधिकांश (सभी?) को प्रतिस्थापित करता है, शायद आप परमाणु और उसके मूल पुस्तकालयों के कार्यान्वयन में एक चोटी ले सकते हैं। –

उत्तर

2

सी ++ 11 एक परमाणु पुस्तकालय शामिल है, और यह आसान है अगर आप इसका इस्तेमाल कर सकते हैं:

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

धन्यवाद, हालांकि वीसी ++ 2010 सी ++ 11 का समर्थन नहीं करता है। LazySet में 'iValue.store' क्या कोड उत्पन्न करता है? – James

संबंधित मुद्दे