2015-12-05 56 views
5

我正在學習有關C++的多線程,並試圖建立一個線程池,但得到一個編譯器錯誤說「錯誤:'mapperNodes'未被捕獲」和「錯誤:」命令「未被捕獲」。我已經讀了一些關於使用「this」來捕獲lambda中的變量,但到目前爲止沒有任何工作。編譯器線程池的lambda函數中的「未捕獲」的錯誤變量

如何在下面的代碼中使用線程池lambda函數中的命令和mapperNoders變量?

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

@ M.M,我認爲你錯了。 TC++ PL第4版的§11.4.4。明確表示可以省略空的參數列表。例如,[cppreference.com中的這篇文章](http://en.cppreference.com/w/cpp/language/lambda)也是如此。 – Paulo1205

+0

@ Paulo1205很酷,很高興知道 –

回答

5

當你寫pool.schedule([id]{ /*...*/ });,你告訴你的拉姆達只希望id變量的值,而不是其他的副本編譯器。

要爲lambda提供MapReduceServer::spawnMappers()的所有變量(的副本),可以將[id]更改爲[=]

+1

這就是說,你可能不希望所有可用變量的*拷貝*。 –

+0

我會發送類似[mapperNodes,命令]的東西嗎? – user3316012

+0

@JoelCornett,同意,變量'池'可以被排除在外。也許他應該使用'[id,command,mapperNodes]'代替。 – Paulo1205