multithreading - क्या बूस्ट::थ्रेड और बूस्ट::mutex को c++11 समकक्षों के साथ प्रतिस्थापित करना स्मार्ट है?



boost (6)

प्रेरणा: कारण मैं इस पर विचार कर रहा हूं कि मेरा प्रतिभा प्रोजेक्ट मैनेजर सोचता है कि बढ़ावा एक और निर्भरता है और यह भयानक है क्योंकि "आप इस पर निर्भर करते हैं" (मैंने बढ़ावा की गुणवत्ता की व्याख्या करने की कोशिश की, फिर कुछ समय बाद छोड़ दिया :( )। छोटे कारण यह है कि मैं ऐसा क्यों करना चाहता हूं कि मैं सी ++ 11 फीचर्स सीखना चाहूंगा, क्योंकि लोग इसमें कोड लिखना शुरू कर देंगे। इसलिए:

  1. #include<thread> #include<mutex> बीच 1: 1 मैपिंग है और समकक्षों को बढ़ावा देता है?
  2. क्या आप सी ++ 11 के साथ बूस्ट स्टफ को प्रतिस्थापित करने के लिए एक अच्छा विचार मानेंगे
    सामान। मेरा उपयोग आदिम है, लेकिन क्या ऐसे उदाहरण हैं जब std प्रस्ताव नहीं देता है कि क्या बढ़ावा देता है? या (निंदा) इसके विपरीत?

पीएस मैं जीसीसी का उपयोग करता हूं इसलिए हेडर वहां हैं।


Answers

बूस्ट के बीच कई अंतर हैं। थ्रेड और सी ++ 11 मानक थ्रेड लाइब्रेरी:

  • बूस्ट थ्रेड रद्दीकरण का समर्थन करता है, सी ++ 11 धागे नहीं करते हैं
  • सी ++ 11 std::async का समर्थन करता है, लेकिन बूस्ट नहीं करता है
  • बूस्ट में एक boost::shared_mutex एकाधिक-पाठक / सिंगल-लेखक लॉकिंग के लिए है। समान std::shared_timed_mutex केवल C ++ 14 ( N3891 ) के बाद उपलब्ध है, जबकि std::shared_mutex केवल C ++ 17 ( N4508 ) के बाद उपलब्ध है।
  • सी ++ 11 टाइमआउट बूस्ट टाइमआउट्स के लिए अलग हैं (हालांकि इसे जल्द ही बूस्ट बदलना चाहिए। क्रोनो स्वीकार कर लिया गया है)।
  • कुछ नाम अलग हैं (उदाहरण के लिए boost::unique_future बनाम std::future )
  • std::thread तर्क-गुजरने वाले अर्थशास्त्र को boost::thread लिए अलग हैं boost::thread --- बूस्ट बूस्ट boost::bind का उपयोग करता है, जिसके लिए प्रतिलिपि तर्क की आवश्यकता होती है। std::thread move-only प्रकारों जैसे std::unique_ptr को तर्क के रूप में पारित करने की अनुमति देता है। boost::bind के उपयोग के कारण, नेस्टेड बाइंड एक्सप्रेशन में _1 जैसे प्लेसहोल्डर्स के अर्थशास्त्र अलग-अलग हो सकते हैं।
  • यदि आप स्पष्ट रूप से join() या detach() तो boost::thread विनाशक और असाइनमेंट ऑपरेटर थ्रेड ऑब्जेक्ट को नष्ट / असाइन किए जाने पर detach() को कॉल करेगा। सी ++ 11 std::thread ऑब्जेक्ट के साथ, इसके परिणामस्वरूप std::terminate() को कॉल किया जाएगा और एप्लिकेशन को निरस्त कर दिया जाएगा।

केवल- std::unique_ptr पैरामीटर के बारे में बिंदु को स्पष्ट करने के लिए, निम्नलिखित मान्य C ++ 11 है, और अस्थायी std::unique_ptr से int के स्वामित्व को नया थ्रेड प्रारंभ होने पर f1 के पैरामीटर में स्थानांतरित करता है। हालांकि, अगर आप boost::thread उपयोग करते हैं तो यह काम नहीं करेगा, क्योंकि यह आंतरिक रूप से boost::bind का उपयोग करता है, और std::unique_ptr प्रतिलिपि नहीं बनाई जा सकती है। जीसीसी के साथ प्रदान की गई सी ++ 11 थ्रेड लाइब्रेरी में भी एक बग है जो इस काम को रोकती है, क्योंकि यह वहां भी कार्यान्वयन में std::bind का उपयोग करती है।

void f1(std::unique_ptr<int>);
std::thread t1(f1,std::unique_ptr<int>(new int(42)));

यदि आप बूस्ट का उपयोग कर रहे हैं तो यदि आप अपने कंपाइलर का समर्थन करते हैं तो आप शायद सी ++ 11 धागे को अपेक्षाकृत दर्द रहित रूप से स्विच कर सकते हैं (उदाहरण के लिए लिनक्स पर जीसीसी के हाल के संस्करणों में सी ++ 11 थ्रेड लाइब्रेरी का सबसे अधिक कार्यान्वयन है -std=c++0x मोड)।

यदि आपका कंपाइलर सी ++ 11 थ्रेड का समर्थन नहीं करता है तो आप जस्ट :: थ्रेड जैसे तृतीय-पक्ष कार्यान्वयन प्राप्त कर सकते हैं, लेकिन यह अभी भी एक निर्भरता है।


std::thread बड़े पैमाने पर boost::thread बाद मॉडलिंग किया जाता है, कुछ मतभेदों के साथ :

  • बूस्ट की गैर-प्रतिलिपि, एक-हैंडल-मैप्स-टू-वन-ओएस-थ्रेड, अर्थशास्त्र को बरकरार रखा जाता है। लेकिन यह धागा कारखाने के कार्यों से थ्रेड लौटने और कंटेनर में रखने की अनुमति देने के लिए चल रहा है।
  • यह प्रस्ताव boost::thread को रद्दीकरण जोड़ता है, जो एक महत्वपूर्ण जटिलता है। इस परिवर्तन का न केवल थ्रेड पर बल्कि सी ++ थ्रेडिंग लाइब्रेरी के बाकी हिस्सों पर भी बड़ा प्रभाव पड़ता है। ऐसा माना जाता है कि लाभ के कारण यह बड़ा परिवर्तन उचित है।
    • थ्रेड डिस्ट्रक्टर को अब पैरेंट थ्रेड रद्द होने पर दुर्घटनाग्रस्त बाल धागे से बचने के लिए अलग करने से पहले रद्द करना होगा।
    • एक स्पष्ट डिटेच सदस्य को अब रद्द किए बिना अलग करने में सक्षम होना आवश्यक है।
  • थ्रेड हैंडल और थ्रेड पहचान की अवधारणाओं को दो वर्गों में विभाजित किया गया है (वे boost::thread में एक ही कक्षा हैं)। यह थ्रेड पहचान के आसान हेरफेर और भंडारण का समर्थन करने के लिए है।
  • कोई थ्रेड आईडी बनाने की क्षमता जिसे किसी अन्य योजक थ्रेड के बराबर तुलना करने की गारंटी नहीं दी गई है ( boost::thread यह नहीं है)। यह कोड के लिए आसान है जो जानना चाहता है कि क्या इसे पिछले कॉल के समान थ्रेड द्वारा निष्पादित किया जा रहा है (रिकर्सिव म्यूटेक्स एक ठोस उदाहरण हैं)।
  • मूल थ्रेड हैंडल प्राप्त करने के लिए "बैक दरवाजा" मौजूद है ताकि ग्राहक इच्छित होने पर अंतर्निहित ओएस का उपयोग करके धागे का उपयोग कर सकें।

यह 2007 से है, इसलिए कुछ बिंदु अब मान्य नहीं हैं: boost::thread में अब native_handle फ़ंक्शन है, और, जैसा कि native_handle इंगित करते हैं, std::thread को अब रद्दीकरण नहीं होता है।

मुझे boost::mutex और std::mutex बीच कोई महत्वपूर्ण अंतर नहीं मिला।


विजुअल स्टूडियो 2013 के साथ std::mutex boost::mutex से भिन्न व्यवहार करता प्रतीत होता है, जिसने मुझे कुछ समस्याएं उत्पन्न की हैं ( यह प्रश्न देखें)।


std::thread पर माइग्रेट न करने का एक कारण है।

यदि आप स्थैतिक लिंकिंग का उपयोग कर रहे हैं, तो इन gcc कीड़े / सुविधाओं के कारण std::thread अनुपयोगी हो जाता है:

अर्थात्, यदि आप std::thread::detach या std::thread::join कॉल करते हैं तो इसमें अपवाद या क्रैश हो जाएगा, जबकि इन मामलों में boost::thread ठीक काम करता है।


उद्यम प्रकरण

यदि आप एंटरप्राइज़ के लिए सॉफ़्टवेयर लिख रहे हैं जिसे ऑपरेटिंग सिस्टम की मध्यम से बड़ी विविधता पर चलने की आवश्यकता है और इसके परिणामस्वरूप उन ऑपरेटिंग सिस्टम पर विभिन्न प्रकार के कंपाइलर्स और कंपाइलर संस्करण (विशेष रूप से अपेक्षाकृत पुराने) के साथ निर्माण करना है, तो मेरा सुझाव है कि दूर रहना सी ++ 11 अभी के लिए पूरी तरह से। इसका मतलब है कि आप std::thread उपयोग नहीं कर सकते हैं, और मैं boost::thread का उपयोग करने की सलाह boost::thread

बेसिक / टेक स्टार्टअप केस

यदि आप एक या दो ऑपरेटिंग सिस्टम के लिए लिख रहे हैं, तो आप निश्चित रूप से जानते हैं कि आपको केवल एक आधुनिक कंपाइलर के साथ निर्माण करने की आवश्यकता होगी जो अधिकतर सी ++ 11 (जैसे वीएस2015, जीसीसी 5.3, एक्सकोड 7) का समर्थन करता है, और आप पहले से नहीं हैं बूस्ट लाइब्रेरी पर निर्भर, तो std::thread एक अच्छा विकल्प हो सकता है।

मेरा अनुभव

मैं व्यक्तिगत रूप से कठोर, भारी उपयोग, अत्यधिक संगत, अत्यधिक संगत पुस्तकालयों जैसे कि बनाम एक बहुत ही आधुनिक विकल्प के रूप में आंशिक हूं। यह विशेष रूप से जटिल प्रोग्रामिंग विषयों जैसे थ्रेडिंग के लिए सच है। इसके अलावा, मैंने वातावरण, कंपाइलर्स, थ्रेडिंग मॉडल आदि की एक विस्तृत श्रृंखला में boost::thread (और सामान्य रूप से बढ़ावा) के साथ लंबे समय से बहुत सफलता प्राप्त की है। जब मेरी पसंद है, तो मैं बूस्ट चुनता हूं।


दिलचस्प सवाल - बिल्कुल आपका जवाब नहीं, लेकिन मुझे काउंटर स्ट्राइक लोगों के शुरुआती दिनों में याद है जो अपने opengl32.dll को एक बॉट किए गए व्यक्ति के साथ प्रतिस्थापित करते थे जो बहुभुज को पारदर्शी के रूप में प्रस्तुत करेगा ताकि वे दीवारों के माध्यम से देख सकें।

हैक्स में सुधार हुआ और अधिक परेशान हो गया, और लोगों को और अधिक रचनात्मक मिला। अब वाल्व / स्टीम उन्हें हटाने का अच्छा काम करते हैं। अगर आप इस सामान के साथ खेलने की योजना बना रहे हैं तो बस थोड़ी सी चेतावनी, स्टीम 'हैक्स' के लिए स्कैन करता है और यदि कोई पाया जाता है, तो वे आपको स्थायी रूप से प्रतिबंधित कर देंगे





c++ multithreading c++11 boost mutex