我正在获取文件的数据作为字节块(向量)的队列。 并且需要启动一个线程以将此数据转储到文件中。 没有线程代码工作正常(如果将lambda body放到函数本身)。但是使用lambda线程函数它不起作用。
首先 - lambda中的路径是空的, while(!one_file.empty())推迟循环体,即使队列大小不是零。
参数传递和捕获可能出现什么问题?
std::thread dump_to_file(std::string path, std::queue<std::vector<char>>&& one_file) {
return std::thread {[&]() {
std::ofstream out((path + ".bak").c_str());
while (!one_file.empty()) {
std::copy(one_file.front().begin(), one_file.front().end(), std::ostream_iterator<char>(out));
one_file.pop();
}
}};
}
答案 0 :(得分:3)
您正在捕获对函数局部变量的引用。从函数返回时path
超出范围,所以现在你的lambda引用了一个被破坏的对象。如果你改为按值([=]
)捕获,那么变量将存在于lambda对象中。
您也可以通过引用将两个变量传递给函数,然后您可以通过引用捕获它们,因为它们仍然存在于dump_to_file
的调用站点