2015-12-05 29 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