2013-08-29 10 views
5

तो यह बिल्कुल स्पष्ट लगता है:आपको स्पष्ट रूप से धागे में शामिल क्यों होना है?

#include <iostream> 
#include <thread> 

void second() { 
    cout << "Don't thread on me!" << endl; 
} 

int main() { 
    thread t { second }; 
    t.join(); 

    return 0; 
    cin.get(); 
} 

अगर मैं join() तो सिस्टम को कॉल abort() शामिल नहीं हैं। मुझे यह समझ में नहीं आता है, क्या थ्रेड बाहर निकलना चाहिए? थ्रेड में शामिल होने के कारण ऐसा लगता है कि यह कोड को ठीक से encapsulate करने के लिए कठिन बना देगा। इसके साथ क्या सौदा है?

+2

यहाँ इस बारे में एक अच्छा पढ़ने है: http://www.domaigne.com/blog/computing/joinable-and- अलग-अलग धागे/ – LarryPel

+2

'मुख्य' को 'int' वापस करना होगा। – chris

+2

यह संकलित नहीं होगा क्योंकि इसमें कुछ '# शामिल' निर्देश गायब हैं। http://sscce.org/ –

उत्तर

4

वह सी ++ थ्रेडिंग लाइब्रेरी के डिज़ाइन का हिस्सा है। आप join धागे की आवश्यकता नहीं है, तो आप detach भी कर सकते हैं। लेकिन मैं अनुशंसा नहीं करता कि आप detach-थ्रेड थ्रेड के लिए डिफ़ॉल्ट हैं, क्योंकि यह जटिलताओं का अपना सेट लाता है।

आप जो कह रहे हैं उसके विपरीत, मुझे नहीं लगता कि यह कोड को encapsulate करने के लिए कठिन बनाता है। अमूर्तता के विभिन्न स्तर हैं, और धागे स्तर का चयन करने का अर्थ है कि आपको यह पता होना चाहिए कि धागे हैं और आपको उन्हें संभालने की आवश्यकता है।

अलग बातें के लिए आप कपोल-कल्पना के विभिन्न स्तरों, उदाहरण के लिए चुन सकते हैं:

int main() { 
    auto f = std::async([](){ std::cout << "Don't tread on me\n" << std::flush; }); 
    f.get();  // Wait for the task to complete 
} 
+0

आह, मैंने अभी तक 'async' को छुआ नहीं है। – sircodesalot

+0

@ सिर्कोड्सलॉट: 'धागा निम्न स्तर के प्राइमेटिव हैं। यहां तक ​​कि 'std :: भविष्य <> '/' std :: वादा <> '/' std :: async' उच्च स्तर नहीं है, लेकिन मानक को उस चीज़ से शुरू करने की आवश्यकता है जिस पर सहमति हो सकती है। मुझे लगता है कि निकट भविष्य में स्टैंडराइजेशन के लिए अधिक से अधिक उच्च स्तरीय संरचना प्रस्तावित की जाएगी। और समेकन के लिए पहले से ही पुस्तकालय हैं जो उच्च स्तरीय उपकरण प्रदान करते हैं। –

+0

** 30.3.1.3 ** [नोट: या तो को निहित रूप से अलग करने या उससे जुड़ने के लिए इसके विनाशक में एक जुड़ने योग्य() थ्रेड के परिणामस्वरूप शुद्धता (अलग करने के लिए) डीबग करना मुश्किल हो सकता है या प्रदर्शन (शामिल होने के लिए) बग केवल तभी सामने आया जब अपवाद होता है उठाया। इस प्रकार प्रोग्रामर को यह सुनिश्चित करना चाहिए कि थ्रेड अभी भी शामिल होने पर विनाशक को कभी निष्पादित नहीं किया जाता है। -जेंड नोट] – Jason

4

डिफ़ॉल्ट धागे से जुड़ना पड़ता है ताकि स्पॉन्गिंग थ्रेड ट्रैक कर सके और अपने बच्चों को पूरा करने की प्रतीक्षा कर सके (उदाहरण के लिए आप 2+ धागे तक काम का एक गुच्छा सौंपते हैं और फिर काम करते समय सिग्नल करने के लिए उन सभी में शामिल होते हैं किया हुआ)।

आप detach का उपयोग कर सकते हैं ताकि थ्रेड को अपने स्प्रेडिंग थ्रेड से अलग किया जा सके और इससे धागे स्वतंत्र रूप से चल सकें।

+0

आह! यह तो दिलचस्प है. – sircodesalot

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