我正在学习c ++中的多线程,并且我正在尝试建立一个线程池,但是我得到一个编译器错误,说“错误:'mapperNodes'未被捕获”和“错误:'命令'未被捕获”。我已经阅读了一些关于使用“this”来捕获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 :(得分:6)
当您编写pool.schedule([id]{ /*...*/ });
时,您告诉编译器您的lambda只希望 id
变量的值的副本,而不是其他任何内容。
要使MapReduceServer::spawnMappers()
的所有变量(副本)可用于lambda,您可以更改[id]
的{{1}}。