用于线程池的lambda函数内的编译器错误变量“未捕获”

时间:2015-12-05 05:01:01

标签: c++ multithreading lambda scope

我正在学习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;
  });
}

1 个答案:

答案 0 :(得分:6)

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

要使MapReduceServer::spawnMappers()的所有变量(副本)可用于lambda,您可以更改[id]的{​​{1}}。