线程池的 lambda 函数内的编译器错误变量"未捕获"

Compiler Error variable "Not captured" inside lambda function for threadpool

本文关键字:变量 错误 编译器 lambda 函数 线程      更新时间:2023-10-16

我正在学习c++中的多线程,并试图设置线程池,但收到一个编译器错误,称"错误:未捕获'mapperNodes'"answers"错误:没有捕获'command'"。我读过一些关于使用"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;
  });
}

在编写pool.schedule([id]{ /*...*/ });时,您告诉编译器,您的lambda只需要id变量值的副本,而不需要其他内容。

要使MapReduceServer::spawnMappers()的所有变量(的副本)对lambda可用,可以将[id]更改为[=]