multithreading - Thread contemporary access to variables and synchronization mechanisms -
मैं समझना चाहता हूं कि निम्नलिखित कोड सही है
#include & lt; iostream & gt; #include & lt; boost / thread / thread.hpp & gt; # शामिल करें & lt; vector & gt; नेमस्पेस एसटीडी का उपयोग करना; नेमस्पेस बूस्ट का उपयोग करना; वर्ग पृष्ठभूमि_टास्क {निजी: std :: vector & lt; int & gt; संख्या; सार्वजनिक: पृष्ठभूमि_टास्क () {i = 0; numbers.assign (6000,0); } कुछ कुछ लंबा कंप्यूटशन () शून्य (जबकि (++ i और lt; 200) {// boost :: mutex :: scoped_lock (formutex); // cout & lt; & lt; "अंदर थ्रेड: i =" & lt; & lt; यह- & gt; आई & lt; & lt; endl; numbers.at (0) = मैं; Cout & lt; & lt; "थ्रेड इन नंबर्स =" & lt; & lt; संख्याएं। (0) & lt; & lt; endl; को बढ़ावा देने :: this_thread :: नींद (को बढ़ावा देने :: posix_time :: मिलीसेकंड (100)); }} Std :: vector & lt; int & gt; और amp; GetNumbers () {रिटर्न नंबर; } Int i; }; पृष्ठभूमि_टास्क एफ; शून्य मान पिकर () {int j = 0; जबकि ((जे ++) & lt; 20) {boost :: this_thread :: sleep (boost :: posix_time :: milliseconds (1000)); सेर & लेफ्टिनेंट; & lt; "प्रथम संख्या =" & lt; & lt; F.getNumbers ()। पर (0) & lt; & lt; endl; }} Int main (शून्य) (बढ़ावा :: धागा COMP (बढ़ावा :: बाँध (& background_task :: कुछ लायक कम्प्रेशन, & amp; एफ)); बढ़ावा :: धागा मूल्य (मूल्य पिक्चर); comp.join (); वापसी 0; } इस कोड को दो थ्रेड प्रारंभ करना चाहिए: कुछ जो कुछ लाँग कॉम्पूप्शन (मैं एक टाइमर स्लीपर जोड़कर loooong कंप्यूटेशन को अनुकरण करने के लिए जोड़ दिया, जो कि वास्तव में बहुत कम है) और दूसरा थ्रेड जो एक भिन्न फ़्रीक्वेंसी पर एक्सेस करता है कंपेशन धागा में निहित डेटा के लिए।
मैं सोच रहा हूं कि अगर यह दृष्टिकोण सही है, क्योंकि मुझे लगता है कि कोई म्यूटक्स आवश्यक नहीं है, तो मैं आपको यह कोड अधिक धागा सुरक्षित बनाने के लिए कहूंगा सही है, क्योंकि मुझे लगता है कि मुझे कुछ याद आ रहा है ...
क्या यह एक गैर-कॉन्फेंट संदर्भ पास करना सही है या इसे बनाने के लिए अधिक सुरक्षित होना चाहिए? बनाया डेटा कभी भी नहीं लिखा जाना चाहिए, केवल पढ़ा ...
धन्यवाद! मैं इस धागा से उम्मीद करता हूं कि आखिरकार मेरे शुरुआती लोगों को चीजों के बारे में संदेह को ठीक करना ... साझा किए गए सरणी संख्याएं धागा सुरक्षित नहीं है यदि कोड वास्तव में सफलतापूर्वक चल रहा है तो कृत्रिम सो जो आपने डाला है, समस्या को मास्क करने की संभावना है। आपको संख्याओं सदिश, जो बहुत ही सटीक उदाहरण दिया गया है क्योंकि आप इस सदिश को सार्वजनिक फ़ंक्शन getNumbers () के माध्यम से ग्राहकों को बेनकाब करते हैं। ऐसा करने का मतलब है कि आप यह सुनिश्चित कर सकते हैं कि background_task के ग्राहक वास्तव में डेटा के साथ कैसे बातचीत करते हैं। मैं एक boost :: mutex जोड़ूंगा (जैसा कि आप पहले से ही लंबी गणना समारोह में टिप्पणी की गई है), और उसे लंबे समय तक गणना समारोह में लॉक करें (केवल ताला का दायरा रखने के लिए सरणी तक पहुंचने पर)। मैं getNumbers () फ़ंक्शन को भी निकाल दूंगा और इसे एक विशिष्ट सूचकांक पर सरणी से मान प्राप्त करने के लिए एक फ़ंक्शन के साथ बदलें, जैसे int getNumberAt (size_t idx); और boost :: mutex वहां भी ताला लगा।
Comments
Post a Comment