2010-11-15 19 views
9

क्या किसी को हल्के पोर्टेबल सी ++ थ्रेडिंग लाइब्रेरी के बारे में पता है, जो विंडोज, लिनक्स और मैक ओएस एक्स पर काम कर सकता है?हल्के पोर्टेबल सी ++ थ्रेडिंग

विशेष रूप से मेरे मामले में, मैं एक सिम्युलेटर करता हूं कि प्रत्येक बार निर्यात अनुकरण डेटा पास करता है। मैं केवल एक धागा (अनुकरण) चलाने के लिए चाहता हूं जो एक बार थोड़ी देर में एक और थ्रेड (निर्यात) शुरू करेगा। एकमात्र शर्त होगी: यदि निर्यात धागा एक नया शुरू करने से पहले, समाप्त होने तक प्रतीक्षा करना शुरू कर देता है।

धन्यवाद

उत्तर

13

TinyThread++ बारे में क्या?

अपने सी ++ ऐप के लिए पोर्टेबल थ्रेड की आवश्यकता है? क्या आपके लक्ष्य कंपाइलर के लिए सी ++ 0x अनुपलब्ध है? बूस्ट भी बड़ा है?

फिर आपको TinyThread ++ की आवश्यकता है!

टिनीट्रेड ++ सी ++ 0x थ्रेड प्रबंधन कक्षाओं के अनुकूल संगत सबसेट लागू करता है।

+0

इस बारे में नहीं सुना था, धन्यवाद –

+0

बहुत अच्छा, धन्यवाद। –

12

मैं Boost.Thread का उपयोग करें और दूसरों को सिफारिश करेंगे।

यह लगभग हर चीज़ और उपयोग करने में आसान पोर्टेबल है। "हल्के वजन" एकमात्र सवाल है, क्योंकि मुझे सच में यकीन नहीं है कि इसका क्या अर्थ है। बूस्ट हल्का वजन है जिसमें इसका उपयोग करने के लिए लगभग कोई ओवरहेड नहीं है, क्योंकि सभी थ्रेडिंग कार्यक्षमता अंतर्निहित थ्रेडिंग लाइब्रेरी (pthreads, विन 32 एपीआई, सेल बीई इत्यादि) के लिए ढीली स्थिर लपेट रही है। एक "म्यूटेक्स" वास्तव में कुछ भी है जो "लॉक करने योग्य" अवधारणा को लागू करता है (documentation देखें), जो कुछ भी हो सकता है - यहां तक ​​कि आपका खुद का विशेष भी। उस अर्थ में, यह बहुत हल्का और एक्स्टेंसिबल है।

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

बूस्ट के विकल्प के रूप में, मैं OpenMP की अनुशंसा करता हूं, मान लें कि आपके कंपाइलर के लिए इसका समर्थन है। तथ्य यह है कि इसे कुछ और उन्नत सुविधाओं के लिए कंपाइलर समर्थन की आवश्यकता है, इसे "हल्के" चीज़ पर अयोग्य घोषित कर सकता है, लेकिन यह उपयोग पर बहुत हल्का है (पहली बार जब आप #pragma omp parallel for बहुत साफ है)। यह बूस्ट के रूप में फीचर पैक नहीं है (मुझे लगता है कि केवल क्यूटी यहां प्रतिस्पर्धा कर सकता है), लेकिन ओपनएमपी का उपयोग करके आपको कुछ वाकई अच्छी सुविधाएं मिलती हैं जो कोई अन्य थ्रेडिंग लाइब्रेरी नहीं कर सकती है। आपको कुछ आधुनिक कंपाइलर का उपयोग करना होगा, लेकिन जीसीसी और एमएसवीसी दोनों का यहां अच्छा समर्थन है। एक चेतावनी यह है कि यह वास्तव में एक सी पुस्तकालय है, जो कि यदि आप सी ++ कर रहे हैं तो मुझे नुकसान के रूप में दिखाई देता है, लेकिन यह आपकी आवश्यकताओं के लिए एक अच्छी बात हो सकती है।

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

इसके अलावा, Wikipedia

+1

यह है शायद हल्के वजन। बूस्ट से थ्रेड लाइब्रेरी का चयन करने के लिए भी 'बीसीपी थ्रेड' कमांड आपको 9 मेगाबाइट स्रोत कोड देगा। – noxmetus

+2

@noxmetus: यह निर्भर करता है कि "हल्के वजन" शब्द का क्या अर्थ है। –

+0

@ ट्रेविस गॉकेल: ऑक्सफोर्ड डिक्शनरी इस शब्द का निम्नलिखित सामान्य अर्थ देता है: "पतली सामग्री या निर्माण और वजन औसत से _हीन"। स्रोत कोड के 9 मेगाबाइट्स जिनमें थ्रेड लाइब्रेरी के अलावा स्वयं एक दर्जन अलग असंबद्ध पुस्तकालय शामिल हैं, निश्चित रूप से औसत से अधिक है। विंडोज के लिए pthreads, उदाहरण के लिए सिर्फ 1.9 मेगाबाइट है। – noxmetus

2

Boot.Thread वह है जो आप खोज रहे हैं। बूस्ट के दस्तावेज़ पृष्ठों में

पोर्टेबल सी ++ बहु-थ्रेडिंग में इसका विवरण उद्धृत करने के लिए।

+0

लाइटवेट? इस आवश्यकता को अनदेखा क्यों कर रहे हैं? –

+1

@ मैथियू एम। @ ट्रेविस गॉकेल उद्धृत करने के लिए "यह निर्भर करता है कि 'लाइटवेट' शब्द का अर्थ क्या है" –

2

Boost.Thread यहां काम करेगा।

आप मौजूदा थ्रेड को समाप्त करने के लिए join का उपयोग कर सकते हैं।

डॉक्स में अन्य कोड नमूने हैं लेकिन एक धागा शुरू कर इस तरह दिखता है:

struct callable 
{ 
    void operator()(); 
}; 

boost::thread copies_are_safe() 
{ 
    callable x; 
    return boost::thread(x); 
} // x is destroyed, but the newly-created thread has a copy, so this is OK 

boost::thread oops() 
{ 
    callable x; 
    return boost::thread(boost::ref(x)); 
} // x is destroyed, but the newly-created thread still has a reference 
    // this leads to undefined behaviour 
0

मैं ज्यादातर Boost.Thread जो बहुत भारी हो सकता है, Poco.Thread जो हल्के माना जाता है और इंटेल के TBB के बारे में सुना है जो मैं नहीं जानता कि यह कैसे काम करता है।

मैंने सी ++ 0x के साथ थोड़ा प्रयोग किया लेकिन मुझे बताया गया है कि जटिल कार्यान्वयन के लिए अभी तक पर्याप्त परिपक्व नहीं है।

0

मैं C++ 11 Standar का उपयोग धागे एक वर्ग बहु सूत्रण बनाने के लिए और यह लिनक्स, विंडोज और ओएस एक्स के लिए काम करता है के लिए, यह हो सकता है आप के लिए उपयोग पूर्ण हो सकता है:

https://github.com/jorgemedra/C-11-Threads/blob/master/README.md

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