2015-12-05 6 views
5

के लिए लैम्ब्डा फ़ंक्शन के अंदर कंपाइलर त्रुटि चर "कब्जा नहीं किया गया" मैं C++ में मल्टीथ्रेडिंग के बारे में सीख रहा हूं और थ्रेड पूल सेट अप करने का प्रयास कर रहा हूं, लेकिन मुझे "त्रुटि:" मैपर नोड्स "कैप्चर नहीं किया गया है" और "त्रुटि: 'कमांड' कैप्चर नहीं किया गया है"। मैंने लैम्ब्डा में चर को कैप्चर करने के लिए "इस" का उपयोग करने के बारे में कुछ पढ़ा है, लेकिन अभी तक कुछ भी काम नहीं कर रहा है।थ्रेडपूल

मैं नीचे दिए गए कोड में थ्रेड पूल लैम्ब्डा फ़ंक्शन में कमांड और मैपर नोडर्स चर का उपयोग कैसे कर सकता हूं?

void MapReduceServer::spawnMappers() throw() { 
    vector<string> mapperNodes(nodes); 
    random_shuffle(mapperNodes.begin(), mapperNodes.end()); 
    string command = buildCommand(mapperNodes[0], executablePath, mapperExecutable, mapOutputPath); 

    ThreadPool pool(numMappers);//numMappers = 8 

    for (size_t id = 0; id < numMappers; id++) { 
    pool.schedule([id] { 
     cout << oslock << "Thread (ID: " << id << ") has started." << endl << osunlock; 

     spawnWorker(mapperNodes[0], command); /*compiler error here*/ 

     cout << oslock << "Thread (ID: " << id << ") has finished." << endl << osunlock; 
    }); 
} 
+0

@ एमएम, मुझे लगता है कि आप उस पर गलत हैं। टीसी ++ पीएल चौथा संस्करण का §11.4.4। स्पष्ट रूप से कहता है कि एक खाली तर्क सूची छोड़ी जा सकती है। तो, उदाहरण के लिए, [cppreference.com में यह आलेख] (http://en.cppreference.com/w/cpp/language/lambda) करता है। – Paulo1205

+0

@ Paulo1205 ठंडा, –

उत्तर

5

जब आप pool.schedule([id]{ /*...*/ }); लिखा है, आप संकलक है कि आपके लैम्ब्डा केवल चाहता है id चर के मूल्य, और कुछ नहीं की एक प्रति को बताया।

लैम्ब्डा के लिए उपलब्ध MapReduceServer::spawnMappers() के सभी चर बनाने (प्रतिलिपि बनाने के लिए), [=] के लिए आप [id] बदल सकते हैं।

+1

जानना अच्छा है, कहा जा रहा है कि आप शायद सभी उपलब्ध चरों की * प्रति * नहीं चाहते हैं। –

+0

क्या मैं कुछ [mapperNodes, कमांड] भेजूंगा? – user3316012

+0

@ जोएल कॉर्नेट, सहमत, चर 'पूल' छोड़ा जा सकता है। शायद उसे '[id, command, mapperNodes] 'का उपयोग करना चाहिए। – Paulo1205

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