2008-10-20 17 views
41

मैं हर जगह समवर्ती प्रोग्रामिंग के बारे में सुनता रहता हूं। क्या आप लोग इस बारे में कुछ प्रकाश डाल सकते हैं कि यह क्या है और कैसे सी ++ नए मानकों को ऐसा करने में सुविधा मिलती है?समवर्ती प्रोग्रामिंग सी ++?

+3

यदि समवर्ती कंप्यूटिंग आपके लिए नई है तो http://en.wikipedia.org/wiki/Concurrent_programming जैसे कुछ मूल लेखों को देखना सुनिश्चित करें। – lothar

उत्तर

68

Concurrency आपके कोड के बारे में एक ही समय में कई चीजें करने के बारे में है। यह आमतौर पर स्पष्ट "धागे" के साथ किया जाता है, लेकिन अन्य संभावनाएं भी होती हैं। उदाहरण के लिए, यदि आप अपने कोड में ओपनएमपी निर्देशों का उपयोग करते हैं तो ओपनएमपी का समर्थन करने वाला एक कंपाइलर स्वचालित रूप से आपके लिए थ्रेड उत्पन्न करेगा।

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

void my_function() 
{ 
    // do stuff 
} 
std::thread my_thread(my_function); // run my_function in its own thread 

नया C++ 0x मानक भी समर्थन करता है::

C++ 0x धागे में std::thread वर्ग का उपयोग शुरू कर रहे हैं std::atomic<> वर्ग टेम्पलेट के साथ

  • परमाणु मूल्यों और संचालन,
  • डेटा सुरक्षा के लिए म्यूटेक्स (std::mutex, std::recursive_mutex, आदि)
  • लॉक कक्षाएं ताला जीवनकाल (std::lock_guard<>, std::unique_lock<>)
  • std::lock और std::try_lock कार्यों गतिरोध
  • हालत एक घटना के लिए इंतज़ार कर कम करने के लिए चर का जोखिम लिए बिना एक ही समय में एक से अधिक ताले प्राप्त करने के प्रबंधन के लिए प्रबंधन के लिए आर आसानी (std::condition_variable, std::condition_variable_any)
  • वायदा , धागे के बीच गुजरने वाले डेटा को सरल बनाने के लिए वादे और पैक किए गए कार्यों, और एक मूल्य तैयार होने की प्रतीक्षा कर रहे हैं। यह क्लासिक "मैं धागे से एक मूल्य कैसे वापस कर सकता हूं" प्रश्न को संबोधित करता है।
  • धागा सुरक्षित स्थानीय स्थिर का आरंभीकरण वस्तुओं
  • thread_local कीवर्ड धागे की स्थानीय डेटा

घोषित करने के लिए मैं devx पर मेरे लेख में नए C++ 0x धागा पुस्तकालय के एक अधिक विस्तृत सिंहावलोकन दे दी है। कॉम: Simpler Multithreading in C++0x

मैं my blog पर सी ++ में मल्टीथ्रेडिंग और समरूपता के बारे में लिखता हूं। मैं विषय पर एक पुस्तक भी लिख रहा हूं: C++ Concurrency in Action

+1

क्या कुछ भी जोड़ा जा सकता है कि सी ++ 11 बाहर है? मैं कल्पना कर सकता हूं कि अब हम हिल अर्थशास्त्र का उपयोग कर सकते हैं? – Damian

+0

हां आप 'std :: thread' और 'std :: async' के साथ move semantics का उपयोग कर सकते हैं। –

5

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

+1

पॉज़िक्स मानक (यूनिक्स नहीं) –

17

जब आप कहते हैं कि "कैसे सी ++ नए मानकों को समेकित प्रोग्रामिंग" सुविधा मिलती है, तो मुझे लगता है कि आप सी ++ 09 मानक जारी करने के लिए जल्द ही (?) के बारे में बात कर रहे हैं।

नए मानक के रूप में यह वर्तमान में मसौदा रूप में खड़ा है निम्नलिखित मदों है कि समवर्ती प्रोग्रामिंग के साथ मदद का समर्थन करता है:

  • परमाणु प्रकार और पते
  • एक धागा वर्ग
  • thread_local भंडारण (जो सिर्फ जोड़ा गया है कुछ महीने पहले मसौदे मानक में)
  • पारस्परिक बहिष्करण (म्यूटेक्स कक्षाएं)
  • हालत चर - यह विशेष रूप से विंडोज के लिए अच्छा है, क्योंकि आयन चर को Win32 में सही ढंग से कार्यान्वित करना मुश्किल है। इसका मतलब है कि अंततः माइक्रोसॉफ्ट को कम से कम एमएसवीसी ++ रनटाइम में हालत चर के लिए समर्थन प्रदान करना चाहिए, इसलिए WIn32 पर सही स्थिति परिवर्तनीय अर्थशास्त्र प्राप्त करना आसान होगा।
+0

क्या किसी ने अभी तक इन सुविधाओं के बारे में एक अच्छा सारांश लिखा है? –

+0

मुझे लगता है कि वे बूस्ट :: थ्रेड पर भारी आधारित हैं इसलिए उस दस्तावेज़ और नए मानक के बीच बहुत अंतर नहीं होना चाहिए। – gbjbaanb

3

मेरी अलग नज़र से, प्रोग्रामिंग मानदंड के भविष्य दिशाओं के लिए विशिष्ट:

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

जैसे हार्डवेयर में सुधार होता है, यह लंबवत (तेज एकल कोर) के बजाय क्षैतिज (अधिक कोर) में सुधार करने जा रहा है। इसका मतलब है कि "तेज" हार्डवेयर के साथ स्केल करने के लिए ऐप्स को "गुप्त सहमति" की आवश्यकता होगी। भविष्य में विकास के लिए सर्वोत्तम भाषा की स्थिति में रहने के लिए भाषाएं वर्तमान में इसका समर्थन करने की कोशिश कर रही हैं।

सी ++ 0x प्रोग्रामिंग समरूपता के "पुराने" तरीकों के लिए अधिक अंतर्निहित समर्थन जोड़ रहा है। विभिन्न कंपाइलर विक्रेता "नई" विधियां जोड़ रहे हैं जो थ्रेडिंग मॉडल को सारणी देते हैं और धागे की संख्या आदि पर रन-टाइम फैसलों की अनुमति देते हैं (मशीन के हार्डवेयर के आधार पर); विशेष रूप से माइक्रोसॉफ्ट के लिए, एफ #, समवर्ती रनटाइम, समांतर एक्सटेंशन इत्यादि देखें।

आशा है कि मदद करता है।

5

सी ++ CSP2 - आराम कन्करेंसी सी ++

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

सीएसपी के लिए एक एक उचित समवर्ती प्रतिमान पर आधारित है के रूप में धागे और ताले और चीजें हैं जो एक बाद का विचार के रूप में पर हमला बोला जाता है के अन्य सभी तरीके का विरोध किया ।

4

लेख (एक समवर्ती प्रोग्रामिंग भाषा (भी सीएसपी के आधार पर) के लिए Occam-पाई देखें): इन लेखों की जाँच करें संगामिति

  1. Free lunch is over
  2. Selected articles by herbsutter
  3. Link to pdf
  4. के बारे में पता करने के लिए
+0

क्या आप लेखों के मुख्य बिंदुओं का सारांश जोड़ना चाहते हैं, या यह एक [लिंक-केवल-उत्तर] है (http://meta.stackexchange.com/questions/72000/should-there-be-a- नीति-के बारे में-एक-लिंक-केवल-जवाब)? (लिंक में से एक पहले से ही मर चुका है, बीटीडब्ल्यू।) – jogojapan

1

यह है समवर्ती प्रोग्रामिंग को समझने का सबसे अच्छा लेख: Concurrent Programming

आपको इसे पढ़ने के बाद समवर्ती प्रोग्रामिंग और सी ++ की पूरी तस्वीर मिल जाएगी।

एक त्वरित सारांश के रूप में, हम कह सकते हैं कि समवर्ती प्रोग्रामिंग मल्टीटास्किंग करना है। जब कोई प्रोग्राम अवरुद्ध हो जाता है, तो यह अन्य चीजें कर सकता है। आम तौर पर हम नेटवर्क कनेक्शन की प्रतीक्षा करते समय और I/O से निपटने के दौरान अवरुद्ध हो जाते हैं। हम fork() और धागे पुस्तकालयों का उपयोग कर समवर्ती प्रोग्रामिंग की सुविधा दे सकते हैं।

+0

आपके द्वारा पोस्ट किया गया लिंक 404 देता है। – xyres

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