gpt4 book ai didi

c++ - 线程池的 lambda 函数内部的编译器错误变量 "Not captured"

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:28 25 4
gpt4 key购买 nike

我正在学习 C++ 中的多线程并尝试设置线程池,但我收到一个编译器错误,提示“错误:‘mapperNodes’未被捕获”和“错误:‘command’未被捕获”。我读过一些关于使用“this”来捕获 lambda 中的变量的内容,但到目前为止没有任何效果。

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

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][= ]

关于c++ - 线程池的 lambda 函数内部的编译器错误变量 "Not captured",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34101482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com