मेरे पास कई प्रक्रियाओं के बीच एक साझा स्मृति है जो स्मृति को एक निश्चित तरीके से इंटरपेट करता है। पूर्व:साझा स्मृति परमाणु पहुंच
DataBlock {
int counter;
double value1;
double ... }
क्या मैं चाहता हूँ काउंटर के लिए अपडेट करना होगा/atomically वृद्धि की जाती। और उस पते पर एक स्मृति रिलीज होने के लिए। अगर मैं साझा स्मृति का उपयोग कर नहीं थे, उदाहरण के लिए, यह होगा कुछ
तरहstd::atomic<int> counter;
atomic_store(counter, newvalue, std::memory_order_release); // perform release operation on the affected memory location making the write visible to other threads
मैं कैसे एक यादृच्छिक स्मृति स्थान के लिए इस लक्ष्य को हासिल करते हैं (DataBlock काउंटर होने की व्याख्या> ऊपर)। मैं आर्किटेक्चर (x86 linux)
- अद्यतन परमाणु - कैसे करें? (यानी atomicupdate (addr, newvalue))
- मल्टीकोर के लिए मेमोरी सिंकिंग - (यानी मेमोरीसिंक (एडीआर)) - केवल एक ही तरीका जो मैं देख सकता हूं वह std :: atomic_thread_fence (std :: memory_order_release) का उपयोग कर रहा है - लेकिन यह "स्मृति स्थापित करेगा सभी परमाणु और आराम से परमाणु दुकानों के सिंक्रनाइज़ेशन ऑर्डरिंग "- मेरे लिए ओवरकिल - मैं बस काउंटर स्थान को सिंक्रनाइज़ करना चाहता हूं। किसी भी विचार की सराहना करते हैं।
मैं बस अनुमान लगा रहा हूं, लेकिन मुझे लगता है कि सी ++ प्रोग्रामिंग मॉडल में "प्रक्रियाओं" की कोई धारणा नहीं है और स्मृति मॉडल में "साझा स्मृति" की कोई धारणा नहीं है, इसलिए मुझे संदेह है कि मानक स्वयं ही बनाएगा कोई गारंटी साझा स्मृति बहुत अधिक प्लेटफॉर्म-निर्भर सुविधा है, इसलिए अपने प्लेटफ़ॉर्म के दस्तावेज़ों से परामर्श लें। –
क्या आप अपने डेटाब्लॉक में 'परमाणु' डाल सकते हैं? इसे तब तक काम करना चाहिए जब तक कि 'परमाणु ' लॉकफ्री है (मानक स्पष्ट उल्लेख स्मृति के बीच प्रक्रियाओं के बीच साझा स्मृति के रूप में साझा किया गया है)। और नहीं, आप केवल एक यादृच्छिक पते के लिए परमाणु नहीं प्राप्त कर सकते हैं (देखें http://stackoverflow.com/questions/8749038/how-to-use-stdatomic- कुशलतापूर्वक/8749474) @ केरेक एसबी: वास्तव में उस परिदृश्य का उल्लेख किया गया है [atomics.lockfree] अंतिम मसौदे में। –
Grizzly
@ ग्रीज़ली: आपका मतलब गैर-मानक नोट 29.4/3 है? बहुत दिलचस्प, मुझे यह नहीं पता था। –