当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《用于线程池的lambda函数内的编译器错误变量"未捕获"》经验,为你挑选了1个好方法。

我正在学习关于C++多线程,我试图建立一个线程池,但我得到一个编译错误说"错误:'mapperNodes’没有捕获"和"错误:'命令’没有捕获".我已经阅读了一些关于使用"this"来捕获lambda中的变量的内容,但到目前为止还没有任何工作.

如何在下面的代码中使用线程池lambda函数中的命令和mapperNoders变量?

void MapReduceServer::spawnMappers() throw() {
  vector 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;
  });
}

Paulo1205.. 6

当你写的时候pool.schedule([id]{ /*...*/ });,你告诉编译器你的lambda只想要一个id变量值的副本,而不是别的.

要创建MapReduceServer::spawnMappers()lambda可用的所有变量(的副本),您可以更改[id][=].



1> Paulo1205..:

当你写的时候pool.schedule([id]{ /*...*/ });,你告诉编译器你的lambda只想要一个id变量值的副本,而不是别的.

要创建MapReduceServer::spawnMappers()lambda可用的所有变量(的副本),您可以更改[id][=].

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有