2009-01-31 18 views
13

अधिकतर जावा और पिछले पांच सालों से .NET की चपेट में आ रहे थे और उस समय के दौरान कोई महत्वपूर्ण सी या सी ++ नहीं लिखा है। तो थोड़ी देर के लिए उस दृश्य से दूर हो गए हैं।क्या बहु-प्लेटफार्म सी/सी ++ बहु-थ्रेडिंग प्रोग्राम के लिए PThread एक अच्छा विकल्प है?

अगर मैं आज सी या सी ++ प्रोग्राम लिखना चाहता हूं जो कुछ बहु-थ्रेडिंग करता है और विंडोज़, मैक ओएस एक्स और लिनक्स/यूनिक्स में पोर्टेबल स्रोत कोड है, तो क्या यह एक अच्छा विकल्प है?

सी या सी ++ कोड कोई भी जीयूआई नहीं करेगा, इसलिए इसमें से किसी के साथ चिंता करने की आवश्यकता नहीं होगी।

विंडोज प्लेटफ़ॉर्म के लिए, मैं यूनिक्स इम्यूलेशन रनटाइम लाइब्रेरीज़ के संदर्भ में, बहुत सारे यूनिक्स सामान नहीं लेना चाहता हूं। विंडोज के लिए एक पीएचएचड एपीआई पसंद करेंगे जो मौजूदा विंडोज थ्रेडिंग एपीआई पर एक पतली-यथासंभव रैपर है।

परिशिष्ट संपादित करें:

Am बढ़ावा के साथ जा रहा की ओर झुकाव: धागा - मैं भी सक्षम सी इस्तेमाल करने की कोशिश ++ होना चाहता हूँ/कैच अपवाद भी निपटने। और भले ही मेरा प्रोग्राम अपेक्षाकृत कम होगा और विशेष रूप से ओओपीश नहीं होगा, मुझे कक्षा और नामस्थान का उपयोग करके encapsulate पसंद है - सी डिब्बाबंद कार्यों के विपरीत।

उत्तर

14

ठीक है, थ्रेड प्रोग्राम लिखने के लिए pthreads पुराना पॉज़िक्स मानक है। इसका निम्नतम स्तर थ्रेडिंग दिनचर्या है, इसलिए क्रॉस-प्लेटफ़ॉर्म थ्रेडिंग के लिए यह एक अच्छा विकल्प है।

हालांकि, वहाँ विकल्प हैं:

  • boost::thread - एक एसटीएल शैली सूत्रण पुस्तकालय
  • इंटेल की Thread Building Blocks
  • OpenMP - इन दोनों कर रहे हैं की जरूरत के बिना लेखन पिरोया क्षुधा की एक उच्च स्तरीय रास्ता कोई थ्रेडिंग कॉल करने के लिए।

उत्तरार्द्ध के रूप में सभी पूरी तरह से, सभी प्लेटफार्मों पर समर्थित हैं (pthreads, विंडोज POSIX सबसिस्टम के अपने ही हिस्से के रूप में संकलक सेटिंग्स का एक सा की आवश्यकता है जब तक आप Pthreads-w32 उपयोग करना चाहते हैं), तो शायद बाद वाले एक बेहतर हैं चुनाव। boost :: threads थ्रेडिंग लाइब्रेरी की तरह अधिक हैं, अन्य 2 कोड 'थ्रेड' कोड की आवश्यकता के बिना समांतरता प्राप्त करने के उच्च-स्तरीय तरीके हैं, वे आपको लूप लिखने की अनुमति देते हैं जो एक साथ स्वचालित रूप से चलते हैं (सामान्य-सामान्य स्थितियों के अधीन)

बूस्ट :: थ्रेड हालांकि सी संगत लाइब्रेरी नहीं है।

संपादित: ऊपर के पार मंच क्षमताओं:

Intel TBB is cross-platform (विंडोज *, लिनक्स *, और मैक ओएस * एक्स), 32-बिट और 64-बिट अनुप्रयोगों और का समर्थन करता है इंटेल, माइक्रोसॉफ्ट और जीएनयू कंपाइलर्स के साथ काम करता है।

OpenMP संकलक आप उपयोग करना चाहते पर निर्भर करता है, लेकिन जीसीसी और/या इंटेल compilers have supported OpenMP विंडोज, लिनक्स और MacOS।

+0

"जैसा कि बाद वाले सभी प्लेटफार्मों पर पूरी तरह से समर्थित हैं" - यदि सभी प्लेटफॉर्मों का मतलब है कि आप विंडोज और कुछ * निक्स प्लेटफॉर्म हैं तो यह सच है। इसके अलावा यह नहीं है। –

+0

मेरा संपादन देखें। ओपी ने उन 3 प्लेटफार्मों के अलावा किसी और चीज के लिए कभी नहीं पूछा। – gbjbaanb

+0

मैंने इस प्रतिक्रिया को स्वीकार कर लिया क्योंकि यह आगे बढ़ने के संभावित तरीकों पर जानकारी की विस्तृत श्रृंखला प्रस्तुत करता है। – RogerV

4

नहीं, विंडोज़ पर आमतौर पर पाथ्रेड उपलब्ध नहीं हैं। (इसे कार्यान्वित करने के कुछ प्रयास हैं, लेकिन कम से कम ओएस द्वारा समर्थित नहीं है।)

यदि आप सी ++ लिख रहे हैं, तो बूस्ट सामान्य रूप से उत्तर है। बूस्ट। थ्रेड में एक पोर्टेबल (और सुरक्षित) थ्रेडिंग लाइब्रेरी है।

सी में, सबसे आसान समाधान शायद दोनों pthreads और विंडोज थ्रेडिंग एपीआई के लिए एक आम रैपर लिखने के लिए लपेटना है।

11

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

यह हल करने में कठिनाई भी नहीं है और क्रॉस-प्लेटफ़ॉर्म कोड बनाने के लिए एक अच्छा अभ्यास हो सकता है।

मुझे सुझाव है कि आप एक कक्षा बनाएं, उदा। सीटीएचड, जिसमें प्रत्येक प्लेटफ़ॉर्म के लिए अलग .cpp कार्यान्वयन और शुद्ध-वर्चुअल निष्पादन() फ़ंक्शन है जिसे आपके थ्रेड के निर्माण के बाद बुलाया जाता है।

इससे प्लेटफ़ॉर्म के लिए सबसे उपयुक्त API का उपयोग करके आपके सभी थ्रेड-सृजन और नींद/शट डाउन/प्राथमिकता कोड को कार्यान्वित किया जा सकता है। आपको एक शीर्षलेख (उदा। ThreadTypes.h) की भी आवश्यकता हो सकती है जिसमें प्रत्येक प्लेटफ़ॉर्म के लिए परिभाषित/टाइप किए गए हैं।

उदा।

// ThreadTypes.h 
#if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX) 
    typedef DWORD ThreadID 
#elif defined(PLATFORM_PS3) 
    // etc etc 
#endif 

यह है कि कैसे मैं इस तरह के पीसी/PS2/PS3/360/Wii के रूप में प्लेटफार्मों के लिए सभी मेरी पार मंच सूत्रण कोड लिखा है है। यह भी एक अच्छा पैटर्न म्युटेक्स और सेमाफोर है, जो यदि आप सूत्र है कि आपने कभी :)

+0

मुझे यह पसंद है - उन लोगों से गुमनाम डाउनवोट्स जिन्होंने कभी भी कई प्लेटफॉर्म पर ऐप नहीं भेजा है! FTW! –

+0

अरे एंड्रयू, मैंने मूल प्रश्न पोस्ट किया। आपके नीचे मतदान के लिए भी आश्चर्यचकित था।मैंने Win32 थ्रेडिंग पर पतली सी ++ कक्षाओं को घुमाया है - मुझे बस इतना ही कहना होगा कि पॉज़िक्स पर्थ्रेड पर भी और मैं किया जाएगा। दूसरी तरफ, पर्थ्रेड-विन 32 है। बाकी सब कुछ पहले से ही pthreads है। – RogerV

+0

+1: Encapsulation * हमेशा * आपका दोस्त है। यह अतिरिक्त काम की तरह प्रतीत हो सकता है, लेकिन अंततः कम से कम अतिरिक्त समय आपके गधे को बचाएगा। विशेष रूप से जब कोई मानक तोड़ता है और परीक्षण के लिए अप्रत्याशित त्रुटि-मान है। –

0

मैं ZThread पर शर्त लगा सकता

सरल API, आसान उपयोग करने के लिए पर की जरूरत के लिए कुछ कर रहे हैं जैसी चीजों के लिए पालन करने के लिए है pthreads और मुफ्त

+0

कोई विचार क्यों मुझे Zthread लाइब्रेरी का उपयोग करते समय अपने कंसोल पर इतने सारे संदेश मिल रहे हैं? जैसे 'थ्रेडक्यूयू बनाया गया', 'उपयोगकर्ता थ्रेड बनाया गया', आदि। ऐसा लगता है कि ये लाइब्रेरी से डेबग संदेश हैं, मैं उन्हें कैसे बंद कर सकता हूं? – lqr

0

से टिंग भी पर एक नज़र डालें: http://code.google.com/p/ting/

यह विंडोज और लिनक्स के बीच पार मंच है। अभी तक कोई मैक ओएस समर्थन नहीं है।

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