2016-06-30 18 views
18

मैं एक वेक्टर में धागे का संग्रह स्टोर करना चाहता हूं, और अपने कार्यक्रम से बाहर निकलने से पहले उन सभी में शामिल होना चाहता हूं।वेक्टर में थ्रेड्स शामिल नहीं हो सकते हैं

system_error: thread::join failed: No such process 

यहाँ कुछ सरल कोड जो कि मेरी समस्या यह दर्शाता है:: मैं निम्न त्रुटि जब कोई फर्क नहीं पड़ता कि कितने मैं संग्रह में जगह पहले धागा शामिल होने की कोशिश प्राप्त

#include <thread> 
#include <iostream> 
#include <vector> 
#include <functional> 

using std::cout; 
using std::endl; 
using std::vector; 
using std::thread; 
using std::mem_fn; 

int main() 
{ 
    vector<thread> threads(1); 
    threads.push_back(thread([]{ cout << "Hello" << endl; })); 
    for_each(threads.begin(), threads.end(), mem_fn(&thread::join)); 

    // also tried --> for(thread &t : threads) t.join() 
} 

और मैं कर रहा हूँ निम्नलिखित (कोशिश की बजना ++ 4.2.1 और जी ++ 5.3.1) का उपयोग कर यह निर्माण:

g++ -o src/thread_test.o -c -std=c++14 src/thread_test.cpp -pthread 
g++ -o thread_test src/thread_test.o -pthread 

मैं सिर्फ इस इंटरनेट के आसपास कर उदाहरण के बहुत सारे देखते हैं। क्या <thread> या <vector> के अनुबंध में कुछ बदलाव आया है जो इन उदाहरणों को निष्क्रिय करता है?

नोट: भविष्य के पाठकों के लिए एक तरफ के रूप में, मैंने {} असाइनमेंट की कोशिश करने के बाद (1) कन्स्ट्रक्टर तर्क जोड़ना समाप्त कर दिया, जो एक निजी प्रतिलिपि निर्माता के कारण विफल रहता है। कॉपी कन्स्ट्रक्टर से बचने की कोशिश में मैंने अनियमित धागे आवंटित किए - लापरवाही गलती।

+1

कृपया '-प्थ्रेड' को जोड़ने के बजाय, संकलन और लिंकिंग दोनों के लिए '-pthread' कंपाइलर झंडे का उपयोग करें। –

+0

मैं स्कोन का उपयोग कर रहा हूं, इसलिए यह मेरे लिए मेरे लाइब्रेरी तर्कों को प्रारूपित करता है। यह वास्तव में बिना किसी-पठार या -प्पट्रेड के काम करता है और मैंने यह सुनिश्चित करने के लिए इसे जोड़ा था कि मेरी परेशानियों के दौरान मुझे कुछ कार्यान्वयन विवरण नहीं मिला। तो 1) मुझे लगता है कि संकलक चुपचाप मेरे लिए उन झंडे जोड़ रहा है, और 2) गैर मानक मानक lib क्यों बेहतर है? –

+3

'-lpthread' लिंकर को सीधा अनुरोध है जबकि '-pthread' संकलक ड्राइवर द्वारा व्याख्याित एक विकल्प है। यदि आप दोनों संकलन और लिंक समय पर निरंतर '-pthread' का उपयोग करते हैं, जो संकलक ड्राइवर को बहुभाषी-सक्षम प्रोग्राम बनाने के लिए libpthread में लिंक करने के अलावा, _else_ को कुछ भी करने का मौका देता है। उस ने कहा, मैं एक प्रणाली पर नहीं गया है जहां कई वर्षों में वास्तव में कुछ और आवश्यक था। – zwol

उत्तर

33

vector<thread> threads(1);

यह एक धागा जो सूचकांक 0 पर पहुँचा जा सकता है बनाता है।

threads.push_back(thread([]{ cout << "Hello" << endl; }));

यह एक दूसरे धागा जो सूचकांक 1 पर पहुँचा जा सकता है कहते हैं।

for_each(threads.begin(), threads.end(), mem_fn(&thread::join));

यह दोनों thread वस्तुओं पर join कॉल करने के लिए जा रहा है। हालांकि, पहला व्यक्ति कभी शुरू नहीं हुआ था इसलिए यह शामिल नहीं है।

इसके बजाय, आप vector<thread> threads(1);vector<thread> threads; threads.reserve(1); के साथ प्रतिस्थापित कर सकते हैं और push_back का उपयोग जारी रख सकते हैं।

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