C ++ 11 std :: थ्रेड बनाम पॉज़िक्स थ्रेड


157

मुझे अभ्यास में एक या दूसरे को क्यों पसंद करना चाहिए? std::threadएक वर्ग को छोड़कर तकनीकी अंतर क्या हैं ?


5
व्यवहार में आपको उपयोग करना चाहिएstd::async
स्टीफन डॉलबर्ग

@ बम्बोन यह उसी समस्याओं से ग्रस्त है जैसे std::threadकि
गनथर पाईज़

2
संकलक-समर्थन दृश्य से @hirschhornsalz, हाँ। तकनीकी दृष्टिकोण से यह अपवाद सुरक्षा प्रदान करता है, जो std::threadया pthreadsनहीं।
स्टीफन डॉलबर्ग

15
फिर से खोलने के लिए वोट दिया। "तकनीकी अंतर" के लिए अनुरोध इस उद्देश्यपूर्ण जवाबदेह बनाता है। उच्च मत गणना इंगित करती है कि अन्य लोगों ने इस पोस्ट को रचनात्मक और सहायक पाया है।
एड्रियन मैक्कार्थी

जवाबों:


121

यदि आप कई प्लेटफार्मों पर कोड चलाना चाहते हैं, तो पॉज़िक्स थ्रेड्स के लिए जाएं। वे लगभग हर जगह उपलब्ध हैं और काफी परिपक्व हैं। दूसरी तरफ यदि आप केवल लिनक्स / जीसीसी 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अभी भी लागू नहीं हैं।


19
क्या आपके पास इन "प्रदर्शन अड़चन" दावों का समर्थन करने के लिए कोई सबूत है? इसके अलावा, std::threadऔर इसकी राई-शैली अच्छी है क्योंकि यह C ++ अपवादों को संभाल सकता है जबकि pthreads बॉक्स से बाहर नहीं निकल सकता है।
जेसी गुड

9
अब 2014 में, यह उत्तर अभी भी मान्य है?
बकवास

25
2017 की शुरुआत के बारे में अब क्या है?
rmobis

9
2017 मध्य में अब क्या है?
ऑर्बिट

14
अब 2018 के मध्य में क्या होगा?

59

std::threadपुस्तकालय के लिए एक वातावरण समर्थन pthreads में pthreads के शीर्ष पर कार्यान्वित किया जाता है (उदाहरण के लिए: libstdc ++)।

मुझे लगता है कि दोनों के बीच बड़ा अंतर अमूर्तता है। std::threadC ++ क्लास लाइब्रेरी है। std::threadदायरे वाले ताले, पुनरावर्ती mutexes, भविष्य / वादा डिज़ाइन पैटर्न कार्यान्वयन, और अधिक: पुस्तकालय कई सार सुविधाओं, उदाहरण के लिए भी शामिल है।


4
+1मेरे लिए सबसे महत्वपूर्ण बात की ओर इशारा करने के लिए, अर्थात् वह std :: थ्रेड उच्च स्तर की अमूर्तता प्रदान करता है।
sbi

33

std::thread विंडोज, मैकओएस और लिनक्स जैसे विभिन्न प्लेटफार्मों में पोर्टेबिलिटी प्रदान करता है।

जैसा कि नीचे टिप्पणी में @hirshhornsalz और संबंधित उत्तर https://stackoverflow.com/a/13135425/1158895 द्वारा उल्लेख किया गया है , std::threadअभी तक सभी प्लेटफार्मों पर पूरा नहीं हो सकता है। फिर भी, (यह निकट भविष्य में होगा) इसे अधिक पसंद pthreadकिया जाना चाहिए क्योंकि यह आपके आवेदन को और अधिक भविष्य का सबूत बना देना चाहिए।


2
वास्तव में, std :: थ्रेड्स उन सभी प्लेटफार्मों पर पोर्टेबिलिटी प्रदान करता है जो C ++ 11 का समर्थन करते हैं, जबकि POSIX थ्रेड्स केवल POSIX प्लेटफॉर्म (या कुछ न्यूनतम कंपैटिबिलिटी के लिए प्रयास करने वाले प्लेटफॉर्म) पर उपलब्ध हैं।
टोबियास लैंगनर

1
व्यावहारिक पीओवी से यह सिर्फ गलत है। मैंने वास्तव में इस तर्क पर कुछ महीने पहले फैसला किया था - यह एक बड़ी गलती थी। व्यवहार में आपको boost::threadWin64 या Bionic (Android) पर उपयोग करना होगा, क्योंकि std::threadअभी भी बड़े हिस्सों की कमी है, जहां लिनक्स std::threadकाफी परिपक्व है।
गनथर पाईज

1
@hirschhornsalz, मेरे जवाब का बिंदु pthread की तुलना में c ++ 11 थ्रेड कार्यान्वयन द्वारा प्रदान की गई पोर्टेबिलिटी के लाभ को इंगित करना है। ओपी ने बढ़ावा देने के बारे में नहीं पूछा, लेकिन इसके साथ ही पोर्टेबल भी।
ब्रैडी

3
@hirschhornsalz, जैसा कि आपके नकारात्मक स्वर और कभी भी धागे का उपयोग न करने का आरोप लगाने के लिए, वे बस असंवेदनशील हैं और मेरे हिस्से में बहुत प्रयास के लायक नहीं हैं। मुझे लगता है कि कम से कम इस बात का उल्लेख करते समय कि अधिक रचनात्मक टिप्पणी आपको विभिन्न प्लेटफार्मों पर एसटीडी :: थ्रेड का उपयोग करने में आने वाली परेशानियों को इंगित करने के लिए होती है।
ब्रैडी

3
संक्षेप में, c ++ 11 std :: धागा केवल GCC के हाल के संस्करणों के साथ प्रयोग करने योग्य है। यह विजुअल स्टूडियो में लगभग पूर्ण नहीं है, इसलिए विंडोज पर प्रयोग करने योग्य नहीं है। और निश्चित रूप से यह UNIXes पर वाणिज्यिक संकलकों (सोलारिस पर सन स्टूडियो, HP-UX पर HP aCC, AIX पर IBM रिक्त स्थान) में बिल्कुल गायब है। इसलिए, यदि आपका लक्ष्य प्लेटफ़ॉर्म केवल लिनक्स है - c ++ 11 std :: धागा ठीक है; अगर आपको विंडोज या अन्य UNIX की भी आवश्यकता है - बढ़ावा :: धागा जाने का रास्ता है।
vond

7

मेरे लिए तकनीकी अंतर तय करना, pthreads के विपरीत std में सिग्नल हैंडलिंग प्राइमरी की अनुपस्थिति है। अकेले यूडीसी प्रक्रिया का उपयोग करते हुए एक यूनिक्स प्रक्रिया में सिग्नल हैंडलिंग को ठीक से करने में असमर्थता AFAIK है एसटीडी के उपयोग में एक दुर्बल दोष :: थ्रेड के रूप में यह एक को समर्पित करने के लिए सभी संकेतों को संसाधित करने के लिए बोना फाइड मल्टी-थ्रेडेड सिग्नल हैंडलिंग पैटर्न को स्थापित करने से रोकती है। धागा और उन्हें बाकी हिस्सों में ब्लॉक करें। आपको std मानने के लिए मजबूर किया जाता है :: pthread_sigmask का उपयोग करते समय थ्रेड का उपयोग pthreads और आशा के लिए किया जाता है। सिग्नल को ठीक से संभालना उद्यम के लिए यूनिक्स सिस्टम प्रोग्रामिंग में गैर-परक्राम्य है।

2016 में, एसटीडी :: धागा एक खिलौना है; इतना ही आसान।


7
मैं असहमत हूं। और संकेतों का भारी उपयोग एक डिज़ाइन पैटर्न है जिसे अधिकांश अनुप्रयोगों के लिए टाला जा सकता है।
एरिक अलापा

इसके अलावा, std::threadटाइप सुरक्षा लाता है जो pthread नहीं है।
alfC

-3

OpenMP

http://www.openmp.org/

एक मानकीकृत, एसएमपी आधारित मल्टीथ्रेडिंग मानक है जो पहले से ही एक दशक से अधिक समय से लिनक्स और विंडोज पर काम कर रहा है। OpenMP डिफ़ॉल्ट रूप से सभी संकलक के साथ उपलब्ध है, जिसमें GCC और Microsoft Visual Studio शामिल हैं।

ओपनएमपी का उपयोग करते समय, देखने वाली एक बात यह है कि अगर सीपीयू-कोर की तुलना में अधिक थ्रेड हैं, तो संदर्भ ओवरहेड संबंधित स्विचिंग के कारण प्रदर्शन नीचे जाएगा। दूसरी बात यह ध्यान में रखना है कि एक वास्तविक, ऑपरेटिंग सिस्टम स्तर की शुरुआत, धागा अपेक्षाकृत महंगा है। इनिशियलाइज़ेशन एक सेकंड का एक अंश है, लेकिन कुछ अनुप्रयोगों में बहुत छोटे अंश काफी खर्च में जमा होते हैं।

सॉफ्टवेयर आर्किटेक्चर की आवश्यकताओं से संबंधित संगामिति के लिए आप ओपनपीएम का उपयोग करके "लाइटवेट थ्रेड्स" या "ग्रीन थ्रेड्स" के कार्यान्वयन के लिए खोज करना चाहते हैं। अंतर यह है कि ओपनएमपी थ्रेड्स वास्तविक, ऑपरेटिंग सिस्टम स्तर, थ्रेड्स हैं, लेकिन "ग्रीन थ्रेड्स" केवल "सिम्युलेटेड थ्रेड्स" हो सकते हैं जिन्हें कुछ छोटी संख्या में वास्तविक थ्रेड्स का उपयोग करके निष्पादित किया जाता है।


6
कोई अनादर नहीं, लेकिन यह मुख्य प्रश्न से कैसे संबंधित है?
SRG
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.