2009-10-02 10 views
6

सी/सी ++ के साथ बहुप्रचारित अनुप्रयोग बनाने का सबसे आसान तरीका क्या है?सी/सी ++ के साथ बहुप्रचारित अनुप्रयोग बनाने का सबसे आसान तरीका क्या है?

+8

समवर्ती कार्यक्रम लिखने का सबसे आसान तरीका धागे का स्पष्ट रूप से उपयोग नहीं करना है। तुम क्या करने की कोशिश कर रहे हो? – Amok

+2

सी ++ का अगला संस्करण, जिसे प्यार से सी ++ 0x कहा जाता है, को थ्रेडिंग सुविधाएं मिल रही हैं: http://en.wikipedia.org/wiki/C%2B%2B0x#Threading_facilities – luke

+1

ल्यूक - जो अभी भी नहीं जा रहा है इसे आसान बनाएं! –

उत्तर

14

दुर्भाग्य से कोई आसान तरीका नहीं है। विकल्पों का जोड़ा: लिनक्स पर pthread, विंडोज़ पर Win32 एपीआई थ्रेड या बूस्ट :: थ्रेड लाइब्रेरी

5
+4

यह कुछ ऐसा है जो मैं असहनीय मानता हूं, विशेष रूप से बढ़ावा देने की सिफारिश बनाम। Posix Win32 वातावरण के लिए आसानी से पोर्टेबल नहीं है, और एपीआई आदिम के बारे में है जैसा आप प्राप्त कर सकते हैं। – Jherico

+0

वैसे यह स्पष्ट रूप से मल्टीथ्रेडिंग प्रोग्रामिंग को आसान बनाने वाला नहीं है, लेकिन कम से कम यह अच्छी तरह से प्रलेखित है। –

+0

विंडोज़ पर pthreads समर्थित हैं: http://sourceware.org/pthreads-win32/ सभी थ्रेडिंग एपीआई आदिम हैं ... यदि आप थ्रेडपूल, या अभिनेताओं, या धागे पर कुछ अन्य अमूर्तता का उपयोग कर सकते हैं तो आप उच्च स्तर चाहते हैं। –

13

वहाँ कोईआसानकिसी भी भाषा में एक बहु आवेदन बनाने के लिए रास्ता है।

+8

यह सच नहीं है। कार्य के लिए सही भाषा का चयन मल्टीथ्रेड प्रोग्रामिंग को आसान बना सकता है। – Amok

+3

मैंने सबसे आसान तरीका के बारे में पूछा – SomeUser

+6

मल्टीथ्रेड प्रोग्रामिंग ** सरल ** एक साधारण भाषा को आसान ** देख सकता है, लेकिन यह सही होने के लिए सबसे कठिन प्रोग्रामिंग समस्याओं में से एक है। * यदि आपको लगता है कि आप सही मल्टीथ्रेडिंग को लागू करने के लिए पर्याप्त स्मार्ट हैं, तो आप सबसे अधिक नहीं हैं * – voyager

1

मैं Qt के साथ कहूंगा। क्यूटी थ्रेड और क्यूटी Concurrency शायद googling लायक हैं।

7

क्यूटी में एक सुंदर threading support and documentation है, लेकिन जैसा कि अन्य ने चेतावनी दी है कि यह शुरुआती लोगों के लिए नहीं है। दस्तावेज़ लिंक मैं ही दे दी है एक short reading list

2

C++0x विनिर्देश सूत्रण सुविधा भी शामिल है (एक मेरी पसंदीदा नई सुविधाओं के) को इंगित करता है। जल्द ही इससे कोई फर्क नहीं पड़ता कि आप किस ओएस के लिए संकलित कर रहे हैं! बस देखो कितना आसान है एक नया धागा बना सकते हैं और वापस निर्माता धागा करने के लिए शामिल होने के लिए है:

#include <thread> 
#include <iostream> 

class SayHello 
{ 
public: 
    void operator()() const 
    { 
     std::cout<<"hello"<<std::endl; 
    } 
}; 

int main() 
{ 
    std::thread t((SayHello())); 
    t.join(); 
} 

विजुअल स्टूडियो 2010 C++ 0x के कुछ हिस्सों लागू कर रहा है लेकिन हम अभी भी सूत्रण सुविधाओं पर प्रतीक्षा कर रहे हैं।

+0

जब तक आप सी ++ के साथ रखने के इच्छुक हैं, वैसे भी। यदि आप उस मामले को बनाना चाहते हैं, तो आप जावा में अभी यह कर सकते हैं। –

+0

दोस्त .. प्रश्न सी/सी ++ निर्दिष्ट करता है। –

+1

@ जेम्स, जब तक कि चीजें हाल ही में नहीं बदली हैं, मुझे नहीं लगता कि std :: धागा POSIX धागे जैसे मौजूदा कार्यान्वयन के लिए पूर्ण विकल्प नहीं होगा। विशेष रूप से इसमें थ्रेड प्राथमिकताओं जैसी विशेषताएं अनुपलब्ध हैं। विवरण के लिए यह SO उत्तर देखें: http://stackoverflow.com/questions/1273572/will-pthreads-become-obsolete-once-stdthread-makes-into-cox/1274301#1274301 ... भले ही, कोई इनकार नहीं किया जा रहा है :: धागा मानक के लिए एक बहुत स्वागत है। – Void

3

इसके बाद से मैं सी में काम किया ++ और मैं Boost सूत्रण समर्थन नहीं देखा है एक समय हो गया है, लेकिन मैं, यह बहुत semaphore ओएस द्वारा उपलब्ध कराई गई सेवाओं, आमतौर पर या तो POSIX या Win32 संपुटित करने के लिए उपयोगी पाया सरल वर्गों है कि होगा में ताले हासिल करें, और उन्हें विनाशकों में छोड़ दें, जिससे उनका उपयोग काफी सरल हो।

void operateOnSharedResource(SharableResource & foo) { 
    MutexLock lock(foo.getMutex()); 
    // do stuff to foo 
    // implicit call to MutexLock dtor performs release 
} 

अंत में वहाँ इस तरह सरल चाल के बहुत सारे हैं धागा प्रोग्रामिंग कम करने के लिए और मैं अगर बूस्ट अब तक कुछ इस तरह नहीं था आश्चर्य होगा (संपादित करें: यह करता है और उसे Lock Types में दर्ज है)।

भले ही, बहु-थ्रेडेड कोड लिखने की मुख्य समस्या किसी भी तृतीय पक्ष लाइब्रेरी द्वारा हल नहीं की जा रही है, और यह समझ में आता है कि आपका कोड उपयोगी रूप से समानांतर कैसे किया जा सकता है, और जहां साझा संसाधनों को छुआ जा रहा है और उसकाखाता। मल्टी थ्रेडेड कोड लिखते समय मैं अंगूठे के कुछ नियमों का उपयोग करता हूं। साझा संसाधन

  • की संख्या को कम करने के लिए

    • कोशिश वर्ग रैपर कि सभी संचालन परमाणु बनाने में साझा संसाधनों को संपुटित की कोशिश करें।
    • मेक कार्यकर्ता संभव

    उचित कैप्सूलीकरण वास्तव में सुरक्षित मल्टी-थ्रेडेड कोड लिखने के लिए चमत्कार करता है के रूप में सरल सूत्र, क्योंकि कम चीज़ें आप देख सकते हैं, कम चीज़ें एक रेस स्थिति हो सकती है।

  • 5

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

    और सिर्फ इसलिए कि कोई भी अब तक यह उल्लेख किया गया है, OpenMP कि कई आधुनिक मुख्यधारा compilers में समर्थित है और संगामिति के उपयोग को आसान बनाने का इरादा है एक और विकल्प है। http://openmp.org/wp/

    8

    बस इसे उल्लेख करने के लिए, क्योंकि यह उल्लेख नहीं किया गया है: OpenMP समर्थन (http://openmp.org/wp/)

    +1

    मैं पूरी तरह से सहमत हूं! – Jacob

    +0

    यदि आप इस मॉडल में अपने प्रोग्राम को फिट कर सकते हैं तो यह निश्चित रूप से सबसे आसान तरीका है। असल में मैं इस कारण से ओपनएमपी का उपयोग करके एक लघु परीक्षण कार्यक्रम लिखने की प्रक्रिया में हूं। –

    2

    के साथ एक संकलक के बारे में मैं सबसे आसान, लेकिन IMO सबसे उपयोगकर्ता के अनुकूल सूत्रण पुस्तकालय यकीन नहीं है पोको सी ++ प्रोजेक्ट में शामिल है। पूर्वावलोकन के लिए Thread.h शीर्षलेख फ़ाइल पर एक नज़र डालें।

    1

    Posix थ्रेड काफी अच्छा है, वे भी महान प्रलेखन और ट्यूटोरियल के साथ आते हैं।

    जावा धागे जितना आसान नहीं है, लेकिन अभी भी काफी अच्छा है।

    1

    यह पूरी तरह से निर्भर करता है कि आप क्या कर रहे हैं। यदि आप ओपनएमपी में जो कर रहे हैं वह फिट कर सकते हैं तो यह जाने का तरीका है। अन्यथा आप Intel's TBB देख सकते हैं। टीबीबी कई वर्कफ़्लो प्रदान करता है जिन्हें आप फिट करने में सक्षम होना चाहिए, लेकिन लाइब्रेरी दोहरी लाइसेंस प्राप्त है और आप या तो लाइसेंस स्वीकार नहीं कर पाएंगे। यदि ओपनएमपी और टीबीबी दोनों बाहर हैं, तो आपको अपने ऑपरेटिंग सिस्टम के थ्रेड पूल क्षमताओं पर विचार करना चाहिए।

    कुछ बिंदु आप गोली काटने और Boost.Thread उपयोग करना पड़ सकता पर

    । यदि ऐसा है, तो आप what makes multithreading in C++ hard पर देखना चाहेंगे (यदि आप सी ++ 0x का उपयोग नहीं कर रहे हैं तो भी पढ़ने के लिए अच्छा है: "यह धागे स्वयं नहीं है, यह संचार है जो समस्याओं का कारण बनता है। परिवर्तनीय साझा राज्य अंतर्निहित संचार पेश करता है," पृष्ठ 3)।

    2

    Boost.Thread अपेक्षाकृत आसान है क्योंकि यह पोर्टेबल, अच्छी तरह से प्रलेखित है और इसमें उच्च स्तरीय एपीआई है जैसे scoped_try_lock

    1

    सबसे आसान तरीका है परहेज/परिवर्तनशील साझा राज्य को कम करके है।

    एक बार जब आप परिवर्तनशील साझा किया है राज्य, आप ताला जो है, जहां मल्टी-थ्रेडेड कार्यक्रमों लिखित रूप में कठिनाई के थोक मौजूद है के साथ सौदा करने की जरूरत है।

    2

    वाले पहले ही उल्लेख किया इसके अलावा, ACE एक और लोकप्रिय और व्यापक रूप से तैनात सी ++ रूपरेखा है कि कई प्लेटफार्मों भर में धागा encapsulations प्रदान करता है। सी ++ की शैली Boost.Thread के रूप में आधुनिक नहीं है, उदाहरण के लिए, लेकिन यह काफी परिपक्व है।

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