मुझे अभ्यास में एक या दूसरे को क्यों पसंद करना चाहिए? std::thread
एक वर्ग को छोड़कर तकनीकी अंतर क्या हैं ?
std::thread
कि
std::thread
या pthreads
नहीं।
मुझे अभ्यास में एक या दूसरे को क्यों पसंद करना चाहिए? std::thread
एक वर्ग को छोड़कर तकनीकी अंतर क्या हैं ?
std::thread
कि
std::thread
या pthreads
नहीं।
जवाबों:
यदि आप कई प्लेटफार्मों पर कोड चलाना चाहते हैं, तो पॉज़िक्स थ्रेड्स के लिए जाएं। वे लगभग हर जगह उपलब्ध हैं और काफी परिपक्व हैं। दूसरी तरफ यदि आप केवल लिनक्स / जीसीसी std::thread
का उपयोग करते हैं, तो यह पूरी तरह से ठीक है - इसका उच्च स्तर का एब्स्ट्रक्शन स्तर है, वास्तव में अच्छा इंटरफ़ेस है और अन्य सी ++ 11 वर्गों के साथ अच्छी तरह से खेलता है।
C ++ 11 std::thread
वर्ग दुर्भाग्य से हर प्लेटफ़ॉर्म पर मज़बूती से (अभी तक) काम नहीं करता है, भले ही C ++ 11 उपलब्ध हो। उदाहरण के लिए देशी Android std::thread
या Win64 में यह काम नहीं करता है या इसमें गंभीर प्रदर्शन बाधाएं हैं (2012 तक)।
एक अच्छा प्रतिस्थापन है boost::thread
- यह बहुत समान है std::thread
(वास्तव में यह एक ही लेखक से है) और मज़बूती से काम करता है, लेकिन निश्चित रूप से, यह तीसरे पक्ष के पुस्तकालय से एक और निर्भरता का परिचय देता है।
संपादित करें: 2017 तक, std::thread
ज्यादातर देशी Android पर काम करता है। कुछ कक्षाएं, जैसे std::timed_mutex
अभी भी लागू नहीं हैं।
std::thread
और इसकी राई-शैली अच्छी है क्योंकि यह C ++ अपवादों को संभाल सकता है जबकि pthreads बॉक्स से बाहर नहीं निकल सकता है।
std::thread
पुस्तकालय के लिए एक वातावरण समर्थन pthreads में pthreads के शीर्ष पर कार्यान्वित किया जाता है (उदाहरण के लिए: libstdc ++)।
मुझे लगता है कि दोनों के बीच बड़ा अंतर अमूर्तता है। std::thread
C ++ क्लास लाइब्रेरी है। std::thread
दायरे वाले ताले, पुनरावर्ती mutexes, भविष्य / वादा डिज़ाइन पैटर्न कार्यान्वयन, और अधिक: पुस्तकालय कई सार सुविधाओं, उदाहरण के लिए भी शामिल है।
+1
मेरे लिए सबसे महत्वपूर्ण बात की ओर इशारा करने के लिए, अर्थात् वह std :: थ्रेड उच्च स्तर की अमूर्तता प्रदान करता है।
std::thread
विंडोज, मैकओएस और लिनक्स जैसे विभिन्न प्लेटफार्मों में पोर्टेबिलिटी प्रदान करता है।
जैसा कि नीचे टिप्पणी में @hirshhornsalz और संबंधित उत्तर https://stackoverflow.com/a/13135425/1158895 द्वारा उल्लेख किया गया है , std::thread
अभी तक सभी प्लेटफार्मों पर पूरा नहीं हो सकता है। फिर भी, (यह निकट भविष्य में होगा) इसे अधिक पसंद pthread
किया जाना चाहिए क्योंकि यह आपके आवेदन को और अधिक भविष्य का सबूत बना देना चाहिए।
boost::thread
Win64 या Bionic (Android) पर उपयोग करना होगा, क्योंकि std::thread
अभी भी बड़े हिस्सों की कमी है, जहां लिनक्स std::thread
काफी परिपक्व है।
मेरे लिए तकनीकी अंतर तय करना, pthreads के विपरीत std में सिग्नल हैंडलिंग प्राइमरी की अनुपस्थिति है। अकेले यूडीसी प्रक्रिया का उपयोग करते हुए एक यूनिक्स प्रक्रिया में सिग्नल हैंडलिंग को ठीक से करने में असमर्थता AFAIK है एसटीडी के उपयोग में एक दुर्बल दोष :: थ्रेड के रूप में यह एक को समर्पित करने के लिए सभी संकेतों को संसाधित करने के लिए बोना फाइड मल्टी-थ्रेडेड सिग्नल हैंडलिंग पैटर्न को स्थापित करने से रोकती है। धागा और उन्हें बाकी हिस्सों में ब्लॉक करें। आपको std मानने के लिए मजबूर किया जाता है :: pthread_sigmask का उपयोग करते समय थ्रेड का उपयोग pthreads और आशा के लिए किया जाता है। सिग्नल को ठीक से संभालना उद्यम के लिए यूनिक्स सिस्टम प्रोग्रामिंग में गैर-परक्राम्य है।
2016 में, एसटीडी :: धागा एक खिलौना है; इतना ही आसान।
std::thread
टाइप सुरक्षा लाता है जो pthread नहीं है।
OpenMP
एक मानकीकृत, एसएमपी आधारित मल्टीथ्रेडिंग मानक है जो पहले से ही एक दशक से अधिक समय से लिनक्स और विंडोज पर काम कर रहा है। OpenMP डिफ़ॉल्ट रूप से सभी संकलक के साथ उपलब्ध है, जिसमें GCC और Microsoft Visual Studio शामिल हैं।
ओपनएमपी का उपयोग करते समय, देखने वाली एक बात यह है कि अगर सीपीयू-कोर की तुलना में अधिक थ्रेड हैं, तो संदर्भ ओवरहेड संबंधित स्विचिंग के कारण प्रदर्शन नीचे जाएगा। दूसरी बात यह ध्यान में रखना है कि एक वास्तविक, ऑपरेटिंग सिस्टम स्तर की शुरुआत, धागा अपेक्षाकृत महंगा है। इनिशियलाइज़ेशन एक सेकंड का एक अंश है, लेकिन कुछ अनुप्रयोगों में बहुत छोटे अंश काफी खर्च में जमा होते हैं।
सॉफ्टवेयर आर्किटेक्चर की आवश्यकताओं से संबंधित संगामिति के लिए आप ओपनपीएम का उपयोग करके "लाइटवेट थ्रेड्स" या "ग्रीन थ्रेड्स" के कार्यान्वयन के लिए खोज करना चाहते हैं। अंतर यह है कि ओपनएमपी थ्रेड्स वास्तविक, ऑपरेटिंग सिस्टम स्तर, थ्रेड्स हैं, लेकिन "ग्रीन थ्रेड्स" केवल "सिम्युलेटेड थ्रेड्स" हो सकते हैं जिन्हें कुछ छोटी संख्या में वास्तविक थ्रेड्स का उपयोग करके निष्पादित किया जाता है।
std::async