क्या किसी थ्रेड को थूकने से मेमोरी ऑर्डर की गारंटी मिलती है?


20

मैं लगभग यही करना चाहता हूं:

प्रारंभिक धागा:

  • वैश्विक संस्करणों के लिए कुछ मान लिखें (वे फिर कभी नहीं लिखे जाएंगे)
    • यह मध्यम रूप से बड़े डेटा (सरणियाँ, तार आदि) हो सकते हैं। बस नहीं बनाया जा सकता std::atomic<>
  • अन्य धागे स्पॉन

अन्य सूत्र:

  • वैश्विक स्थिति पढ़ें
  • काम करो, आदि।

अब, मुझे पता है कि मैं तर्क पारित कर सकता हूं std::thread , लेकिन मैं इस उदाहरण के माध्यम से C ++ की मेमोरी गारंटी को समझने की कोशिश कर रहा हूं।

इसके अलावा, मुझे पूरा विश्वास है कि किसी भी वास्तविक दुनिया के कार्यान्वयन पर, एक धागा बनाने से एक स्मृति बाधा पैदा होगी जो यह सुनिश्चित करेगी कि धागा उस बिंदु तक लिखे गए सब कुछ "धागा" को "देख" सकता है।

लेकिन मेरा सवाल है: क्या यह मानक द्वारा गारंटी है?

एक तरफ: मुझे लगता है कि मैं कुछ डमी जोड़ सकता था std::atomic<int> या , और यह कि दूसरे धागे शुरू करने से पहले लिखें, फिर दूसरे धागे पर, एक बार स्टार्टअप पर पढ़ें। मेरा मानना ​​है कि पहले होने वाली सभी मशीनरी इस बात की गारंटी देती हैं कि पहले से लिखित वैश्विक स्थिति ठीक से दिखाई दे रही है।

लेकिन मेरा सवाल यह है कि क्या ऐसा कुछ तकनीकी रूप से आवश्यक है, या धागा निर्माण पर्याप्त है?


मुझे लगता है कि मैं कुछ डमी जोड़ सकता हूं std::atomic<int>... आप उपयोग कर सकते हैं std::atomic_thread_fence
रीन काएनबॉय

@ नथनऑलिवर डीओ। टिप्पणी हटा दी गई। मैं गिन नहीं सकता कि आपने कितनी बार यहां मेरी मदद की, मेरे सवाल चाहे कितने भी मूर्ख क्यों न हों ...
idclev 463035818

1
@ idclev463035818 कोई चिंता नहीं। ये हम सभी के साथ हुआ।
नाथनऑलिवर

जवाबों:


26

धागा निर्माण काफी है। थ्रेड कंस्ट्रक्टर के बीच एक सिंक्रोनाइज़ेशन पॉइंट है और नए थ्रेड की शुरुआत प्रति ' थ्रेड.थ्रेड.कॉर्न] 7 के बीच है।

सिंक्रोनाइज़ेशन: कंस्ट्रक्टर के इनवोकेशन का पूरा होने की कॉपी के इनवोकेशन की शुरुआत के साथ सिंक्रोनाइज़ करता है f

इसका मतलब यह है कि नए धागे को स्पॉन करने से पहले थ्रेड में सभी स्थिति स्पॉन्ड थ्रेड को दिखाई देती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.