我正在学习关于C++多线程,我试图建立一个线程池,但我得到一个编译错误说"错误:'mapperNodes’没有捕获"和"错误:'命令’没有捕获".我已经阅读了一些关于使用"this"来捕获lambda中的变量的内容,但到目前为止还没有任何工作.
如何在下面的代码中使用线程池lambda函数中的命令和mapperNoders变量?
void MapReduceServer::spawnMappers() throw() { vectormapperNodes(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; }); }
Paulo1205.. 6
当你写的时候pool.schedule([id]{ /*...*/ });
,你告诉编译器你的lambda只想要一个id
变量值的副本,而不是别的.
要创建MapReduceServer::spawnMappers()
lambda可用的所有变量(的副本),您可以更改[id]
为[=]
.
当你写的时候pool.schedule([id]{ /*...*/ });
,你告诉编译器你的lambda只想要一个id
变量值的副本,而不是别的.
要创建MapReduceServer::spawnMappers()
lambda可用的所有变量(的副本),您可以更改[id]
为[=]
.