2015-10-30 6 views
5

क्या कोई मुझे इस कोड में करने की कोशिश करने वाले चीज़ पर इंगित कर सकता है, क्योंकि SecondLoop धागा बिल्कुल पहुंच योग्य नहीं है? यह केवल तब तक पहुंच योग्य हो जाता है जब मैं while(true) पाश हटा देता हूं।धागे में सच होने पर मैं कैसे उपयोग करूं?

#include <iostream> 
#include <thread> 

using namespace std; 

void Loop() { 
    while(true) { 
     (do something) 
    } 
} 

void SecondLoop() { 
    while(true) { 
     (do something) 
    } 
} 

int main() { 
    thread t1(Loop); 
    t1.join(); 

    thread t2(SecondLoop); 
    t2.join(); // THIS THREAD IS UNREACHABLE AT ALL! 

    return false; 
} 

कारण है कि मैं बहु सूत्रण उपयोग करें, क्योंकि मैं दो छोरों एक ही समय में चल रहा प्राप्त करने की आवश्यकता है।

+5

क्या आप नहीं पहुंचा जा सकता द्वारा मतलब है? 't1.join()' 'मुख्य()' 't1' की नौकरी तक प्रतीक्षा नहीं की जाती है (और जब से आप अनंत लूप का उपयोग करते हैं, तब तक यह कभी नहीं किया जाएगा, जब तक कि आपके पास 'ब्रेक न हो;' कहीं और वहां)। – Zereges

+0

आपका पहला बनाया गया थ्रेड कभी खत्म होने वाले लूप पर चलता है, इसलिए आपको 't1.join() 'में अवरुद्ध कर दिया गया है। या आपके कंकाल में कुछ गुम है ... क्या आप लूप तोड़ते हैं? –

+0

याद रखें कि ['join'] को कॉल करना (http://en.cppreference.com/w/cpp/thread/thread/join) * ब्लॉक * होगा जब तक आप जिस थ्रेड में शामिल हो रहे हैं, वह बाहर निकल गया है। –

उत्तर

14

join वर्तमान धागे को अन्य धागे को समाप्त करने के लिए प्रतीक्षा करने के लिए अवरुद्ध करता है। चूंकि आपका t1 कभी खत्म नहीं होता है, इसलिए आपका मुख्य धागा अनिश्चित काल तक इसके लिए इंतजार कर रहा है।

संपादित करें:

दो धागे अनिश्चित काल के लिए और संगामिति चलाने के लिए, पहले धागे बनाते हैं, और तो दोनों के लिए इंतजार:

int main() { 
    thread t1(Loop); 
    thread t2(SecondLoop); 

    t1.join(); 
    t2.join(); 
} 
+0

धागा बनाने का कोई और तरीका है? – Purixi

+0

@ पुरीक्सी, यह स्पष्ट नहीं है कि आप क्या हासिल करने का प्रयास कर रहे हैं। क्या आप एक थ्रेड को दूसरे से ब्रेक करना चाहते हैं? आपको [यह प्रश्न] मिल सकता है (http://stackoverflow.com/questions/24768814/run-and-break-an-infinite-loop-using-two-threads) usefl – SingerOfTheFall

+0

मैंने आपको यह दिखाने के लिए प्रश्न संपादित किया कि मुझे क्या चाहिए करने के लिए। – Purixi

0

.join() थ्रेड के लिए इंतजार कर रहा है समाप्त करने के लिए (इसलिए इस मामले में यदि आप थोड़ी देर के लूप से बाहर निकलते हैं और थ्रेड फ़ंक्शन से बाहर निकलते हैं)

0

जबकि (सत्य) से जुड़ा हुआ है

#include <iostream> 
#include <thread> 

void Loop() { 
    while(true) { 
     //(do something) 
    } 
} 

void SecondLoop() { 
    while(true) { 
     //(do something) 
    } 
} 

int main() { 
    std::thread t1(Loop); 
    std::thread t2(SecondLoop); 
    t1.join(); 
    t2.join(); 
} 

रूप join ब्लॉक वर्तमान: चलने चल रहा है, आप उस लूप से बाहर निकलने के

2

Loop और SecondLoop संगामिति चलाने के लिए लूप नियंत्रण के कुछ प्रकार का उपयोग करने के लिए एक रास्ता के लिए दिखना चाहिए, आप की तरह कुछ करने के लिए धागा अन्य थ्रेड खत्म करने के लिए प्रतीक्षा करें।

0

मेरी टिप्पणी के आधार पर और मेरा सुझाव है क्या @Nidhoegger जवाब दिया:

int main() { 
    thread t1(Loop); 
    thread t2(SecondLoop); 
    // Your 2 threads will run now in paralel 
    // ... <- So some other things with your application 
    // Now you want to close the app, perhaps all work is done or the user asked it to quit 
    // Notify threads to stop 
    t1running = false; 
    t2running = false; 
    // Wait for all threads to stop 
    t1.join(); 
    t2.join(); 
    // Exit program 
    return false; 

}

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

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