2013-01-03 19 views
11

यदि आपने std::thread और मुख्य धागे (या उस मामले के लिए कोई अन्य धागा) के बीच चर साझा किया है, तो क्या आप अभी भी उन साझा चरों तक पहुंच सकते हैं आप थ्रेड बनाने के तुरंत बाद thread::detach() विधि निष्पादित करते हैं?सी ++ 11 std :: thread :: साझा डेटा तक पहुंच और पहुंच

उत्तर

16

हाँ! detach() पर कॉल करने के बाद वैश्विक, कब्जे वाले और पास-इन चर अभी भी पहुंच योग्य हैं।

हालांकि, अगर आप अलग-अलग कॉल कर रहे हैं, तो संभवतः आप थ्रेड बनाने वाले फ़ंक्शन से वापस लौटना चाहते हैं, जिससे थ्रेड ऑब्जेक्ट को दायरे से बाहर जाने की इजाजत मिलती है। यदि ऐसा है, तो आपको ध्यान रखना होगा कि उस फ़ंक्शन के स्थानीय भी संदर्भ में या पॉइंटर के माध्यम से धागे को पास नहीं किए गए थे।

आप घोषणा के रूप में detach() के बारे में सोच सकते हैं कि धागे को बनाने के थ्रेड के लिए स्थानीय की आवश्यकता नहीं है।

निम्नलिखित उदाहरण में, धागा स्कोप से बाहर होने के बाद शुरुआती धागे के ढेर पर int तक पहुंचता रहता है। यह अपरिभाषित व्यवहार है!

  • घोषित int कहीं कि क्षेत्र से बाहर किसी भी धागे की जरूरत है कि के जीवनकाल के दौरान नहीं जाना होगा:

    void start_thread() 
    { 
        int someInt = 5; 
        std::thread t([&]() { 
         while (true) 
         { 
          // Will print someInt (5) repeatedly until we return. Then, 
          // undefined behavior! 
          std::cout << someInt << std::endl; 
         } 
        }); 
    
        t.detach(); 
    } 
    

    यहाँ कुछ संभव तरीके से अपने धागा के नीचे से बाहर बह जाने से गलीचा रखने के लिए कर रहे हैं यह (शायद एक वैश्विक)।

  • साझा डेटा को std::shared_ptr के रूप में घोषित करें और इसे थ्रेड में मान दें।
  • धागे में मूल्य (एक प्रति प्रदर्शन) द्वारा पास करें।
  • धागे में रैवल्यू संदर्भ (एक चाल प्रदर्शन) द्वारा पास करें।
5

हां। धागे को अलग करने का मतलब यह है कि जब यह समाप्त हो जाता है तो यह स्वयं के बाद साफ हो जाता है और आपको अब join करने की अनुमति नहीं है।

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