2013-03-01 7 views
21

definition from C++ reference द्वारा:std :: thread.join() क्या करता है?

ब्लाकों वर्तमान धागा धागा *this द्वारा की पहचान जब तक इसके निष्पादन खत्म।

तो यह मतलब है जब .join() का उपयोग कर, mutex.lock() करने की कोई जरूरत जब कि धागा कुछ फ़ंक्शन को कॉल क्या है? मैं पारस्परिक बहिष्कार और थ्रेडिंग के लिए नया हूं, इसलिए मैं उलझन में हूं।

नोट: मैं एक किताब कार्रवाई में सी ++ कन्करेंसी पाया है और मैं किताब पढ़ रहा हूँ। यह मेरे जैसे मल्टीथ्रेडिंग पर शुरुआती के लिए बहुत अच्छी तरह लिखा गया है।

सहायता के लिए सभी को धन्यवाद।

+3

डेविड को इसे और अधिक स्पष्ट करने के लिए संपादन के लिए धन्यवाद। मार्टिन: मैंने Google पर प्रयास करने की कोशिश की लेकिन मैंने 4-5 नमूने देखे जिनके पास एक ही विचार था और वास्तव में यह नहीं दिखाता कि मेरे दृष्टिकोण से क्या शामिल हो रहा है .. मैंने सोचा कि पीपीएल यहां जानकार है और कोड के साथ सबसे अच्छे जवाब प्रदान करेगा नमूने हैं। – Guagua

उत्तर

17

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

#include <iostream> 
#include <thread> 
#include <chrono> 
#include <mutex> 

using namespace std; 



int global_counter = 0; 
std::mutex counter_mutex; 

void five_thread_fn(){ 
    for(int i = 0; i<5; i++){ 
     counter_mutex.lock(); 
     global_counter++; 
     counter_mutex.unlock(); 
     std::cout << "Updated from five_thread" << endl; 
     std::this_thread::sleep_for(std::chrono::seconds(5)); 
    } 
    //When this thread finishes we wait for it to join 
} 

void ten_thread_fn(){ 
    for(int i = 0; i<10; i++){ 
     counter_mutex.lock(); 
     global_counter++; 
     counter_mutex.unlock(); 
     std::cout << "Updated from ten_thread" << endl; 
     std::this_thread::sleep_for(std::chrono::seconds(1)); 
    } 
    //When this thread finishes we wait for it to join 
} 
int main(int argc, char *argv[]) { 
    std::cout << "starting thread ten..." << std::endl; 
    std::thread ten_thread(ten_thread_fn); 

    std::cout << "Running ten thread" << endl; 
    std::thread five_thread(five_thread_fn); 


    ten_thread.join(); 
    std::cout << "Ten Thread is done." << std::endl; 
    five_thread.join(); 
    std::cout << "Five Thread is done." << std::endl; 
} 

नोट उत्पादन इस प्रकार दिखाई देंगे कि:

starting thread ten... 
Running ten thread 
Updated frUopmd atteend_ tfhrroema df 
ive_thread 
Updated from ten_thread 
Updated from ten_thread 
Updated from ten_thread 
Updated from ten_thread 
Updated from five_thread 
Updated from ten_thread 
Updated from ten_thread 
Updated from ten_thread 
Updated from ten_thread 
Updated from ten_thread 
Updated from five_thread 
Ten Thread is done. 
Updated from five_thread 
Updated from five_thread 
Five Thread is done. 

के बाद से std :: अदालत साझा किए गए संसाधन का उपयोग और इसका इस्तेमाल भी संरक्षित किया जाना चाहिए है म्युटेक्स।

+1

धन्यवाद जोएल, तो यहां ten_thread.join() प्रोग्राम बताएगा कि दस_थ्रेड किया गया है, और अगले चरण पर जा सकता है? – Guagua

+1

मुख्य चलने वाले निष्पादन का धागा दस_थ्रेड रिटर्न तक ten_thread.join() की कॉल पर अवरुद्ध होगा। एक बार दस_थ्रेड निष्पादन समाप्त होने के बाद मुख्य निष्पादन को आगे बढ़ने की अनुमति है। उम्मीद है की यह मदद करेगा। – Joel

6

शामिल हों() वर्तमान धागे को तब तक रोक देता है जब तक कि कोई दूसरा समाप्त न हो जाए। म्यूटेक्स वर्तमान धागे को रोकता है जब तक कि म्यूटेक्स मालिक इसे रिलीज़ नहीं करता है या लॉक नहीं होने पर तुरंत ताले लगा देता है। तो इन लोगों को काफी अलग

+6

हालांकि, "स्टॉप" के बजाय मैं "निलंबित" पसंद करता हूं। – Sebastian

0

std :: thread.join तीन कार्यों मैं बंद हाथ के बारे में सोच सकते हैं और कुछ अन्य है:

क) को प्रोत्साहित नित्य बनाने/समाप्त /, धागे की नष्ट तो प्रदर्शन चोट और लीक की probabilty में वृद्धि, थ्रेड-रनवे, मेमोरी-रनवे और आपके ऐप के सामान्य नुकसान का नियंत्रण।

बी) अवांछित प्रतीक्षाों को लागू करके जीयूआई घटना-हैंडलर को रोकता है, जिसके परिणामस्वरूप आपके ग्राहक नफरत करते हैं, जो उत्तरदायी 'घंटा ग्लास ऐप्स' होते हैं।

ग) क्योंकि वे एक unresposive, अबाधित धागा की समाप्ति के लिए इंतजार कर रहे हैं बंद करने के लिए विफल क्षुधा का कारण बनता है।

डी) अन्य बुरी चीजें।

मैं समझता हूँ कि आप बहु सूत्रण के लिए नए हैं, और मैं तुम्हें इसके साथ कामना करता हूँ। साथ ही, मान लीजिए कि मेरे पास आज रात बहुत सारे एडनाम ब्रॉडसाइड हैं, लेकिन:

TThread.WaitFor, (डेल्फी) जैसी अन्य भाषाओं में शामिल हों(), और विंडोज एमई जैसे कुशल मल्टीथ्रेडिंग के लिए ऑपरेटिंग करना था सिस्टम। निर्माता-उपभोक्त कतारों के माध्यम से पूल, कार्य, एप्लिकेशन-जीवन सूत्र, अंतर-धागा संचारों -

प्रगति और अन्य बहु अवधारणाओं को समझने में आने के लिए कठिन प्रयास करें। वास्तव में, शामिल होने के अलावा लगभग कुछ भी()।

+3

हाय मार्टिन, सी ++ में मल्टीथ्रेडिंग के बारे में कोई अनुशंसित पढ़ने? – Guagua

1

यह ब्लॉक वर्तमान धागा धागा के निष्पादन तक पूरा हो गया है, जिस पर शामिल होने के() कहा जाता है।

यदि आप थ्रेड पर() या dettach() निर्दिष्ट नहीं करते हैं तो इसके परिणामस्वरूप रनटाइम त्रुटि होगी क्योंकि मुख्य/वर्तमान धागा इसके निष्पादन को पूरा करेगा और बनाए गए अन्य थ्रेड अभी भी चल रहे होंगे।

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