c++ - Multithreading - why working on a reference doesn't change it, while on a pointer works properly -
इस सवाल का पहले से ही एक उत्तर है: < 3 जवाब
क्या कोई मुझे समझा सकता है क्यों < / P>
शून्य करना कुछ (वेक्टर & lt; int & gt; vec) {for (int i = 0; i & lt; 100; ++ i) vec.push_back (i); } Int main (int argc, char ** argv) {vector & lt; int & gt; v; धागा T1 (doSomething, v); धागा T2 (doSomething, वी); t2.join (); t1.join (); Cout & lt; & lt; V.size () & lt; & lt; endl; वापसी 0; 0 प्रिंट करता है, जबकि एक सूचक के साथ एक ही बात 200
शून्य करता है (वेक्टर & lt; int & gt; * vec) {के लिए (int i = 0; आई & lt; 100; ++ i) vec- & gt; पुश_बैक (i); } Int main (int argc, char ** argv) {vector & lt; int & gt; * v = new vector & lt; int & gt; (); धागा T1 (doSomething, v); धागा T2 (doSomething, वी); t2.join (); t1.join (); Cout & lt; & lt; V- & gt; आकार () & lt; & lt; endl; वापसी 0; } एक संदर्भ पर काम नहीं करना चाहिए (सूचक पर काम करने के लिए) बराबर हो?
संपादित करें: यह उद्देश्य पर धागा-सुरक्षित नहीं है
क्या आप मुझे एक संदर्भ के रूप में प्रदान कर सकते हैं कि मुझे स्टड :: रेफरी का उपयोग करने की आवश्यकता क्यों है?
< P> 1) आपका कोड नहीं धागा सुरक्षित (एक सदिश पर समवर्ती push_back ) 2) तर्क डिफ़ॉल्ट रूप से मूल्य से पारित किया जाता है तर्कों की प्रतिलिपि बनाने का यह अर्थ थ्रेड्स के साथ स्वाभाविक है: किसी भी तर्क को कॉपी / थ्रेड-सुलभ संग्रहण में स्थानांतरित किया जाएगा। ऐसा करने से, std ::: धागा साझा ऑब्जेक्ट में संगामिति की पहुंच से बचने के लिए सबसे अच्छा करता है। अपने धागे के संदर्भ के द्वारा एक तर्क पारित करने के लिए उपयोग करें:
धागा T1 (doSomething, std :: ref (v)); धागा T2 (doSomething, std :: ref (v)); ^^^^^^^ बिना std :: ref , न तो जीसीसी या रगड़ इस कोड को संकलित करें।
भविष्य के संदर्भ के लिए, std :: thread कन्स्ट्रक्टर को सी ++ मानक के अनुभाग 30.3.1.2 में वर्णित किया गया है।
Comments
Post a Comment