C++ 如何在线程中将变量正确地传递给lambda函数
这段代码有漏洞。我知道我错误地将对象传递给向量和lambda函数,但我不确定如何解决这个问题。你能给我一些代码检查和修改吗C++ 如何在线程中将变量正确地传递给lambda函数,c++,multithreading,lambda,C++,Multithreading,Lambda,这段代码有漏洞。我知道我错误地将对象传递给向量和lambda函数,但我不确定如何解决这个问题。你能给我一些代码检查和修改吗 std::vector<std::thread> threads; std::vector<std::unique_ptr<FileHandler>> fileHandlers; for (std::string argument : filesToParse) { std::unique_ptr<FileHandler
std::vector<std::thread> threads;
std::vector<std::unique_ptr<FileHandler>> fileHandlers;
for (std::string argument : filesToParse)
{
std::unique_ptr<FileHandler> fileHandler(new FileHandler(argument));
fileHandlers.push_back(std::move(fileHandler));
threads.push_back(std::thread([&fileHandler]()
{
fileHandler->processFile();
}));
}
for(auto i = 0; i < threads.size(); ++i)
{
threads.at(i).join();
fileHandlers.at(i)->mergeMaps(finalMap);
}
std::向量线程;
向量文件处理器;
for(std::string参数:filesToParse)
{
std::unique_ptr fileHandler(新fileHandler(参数));
向后推(std::move(fileHandler));
threads.push_back(std::thread([&fileHandler]()
{
fileHandler->processFile();
}));
}
用于(自动i=0;imergeMaps(finalMap);
}
显示的逻辑有几个问题
fileHandlers.push_back(std::move(fileHandler));
fileHandler
unique\u ptr的内容已移到此处。紧接着:
threads.push_back(std::thread([&fileHandler]() {
这将向每个新线程传递一个对唯一的\u ptr
的引用,该线程的内容刚刚被移出。该unique_ptr
已去见其制造商。它不复存在了。加入唱诗班。它是唯一的
fileHandlers.push_back(std::move(fileHandler));
回到这句话。这里,一个的价格有两个逻辑错误
fileHandlers
是一个向量。向向量添加值可能会重新分配向量。重新分配使所有现有迭代器、指针或对向量现有内容的引用无效。传递对该向量中某个内容的引用,然后在循环的下一次迭代中向该向量添加某个内容,如果该向量重新分配,则会在您的脸上爆炸
这里的明显意图是用所有线程的所有参数列表填充fileHandlers
向量。有两种基本方法可以正确执行此操作:
reserve()
fileHandler
unique\ptr,而是对fileHandler
数组中已填充的unique\ptr
的引用shared_ptr
s,并通过值捕获每个线程的shared_ptr
参数,可以避免预先保留或填充向量显示的逻辑有几个问题
fileHandlers.push_back(std::move(fileHandler));
fileHandler
unique\u ptr的内容已移到此处。紧接着:
threads.push_back(std::thread([&fileHandler]() {
这将向每个新线程传递一个对唯一的\u ptr
的引用,该线程的内容刚刚被移出。该unique_ptr
已去见其制造商。它不复存在了。加入唱诗班。它是唯一的
fileHandlers.push_back(std::move(fileHandler));
回到这句话。这里,一个的价格有两个逻辑错误
fileHandlers
是一个向量。向向量添加值可能会重新分配向量。重新分配使所有现有迭代器、指针或对向量现有内容的引用无效。传递对该向量中某个内容的引用,然后在循环的下一次迭代中向该向量添加某个内容,如果该向量重新分配,则会在您的脸上爆炸
这里的明显意图是用所有线程的所有参数列表填充fileHandlers
向量。有两种基本方法可以正确执行此操作:
reserve()
fileHandler
unique\ptr,而是对fileHandler
数组中已填充的unique\ptr
的引用shared_ptr
s,并通过值捕获每个线程的shared_ptr
参数,可以避免预先保留或填充向量使用
std::move(fileHandler)
小心。您尝试在之后立即访问它。尝试使用fileHandlers.back()
获取最新的文件处理程序。推回移动的处理程序后,您的fileHandler
仍处于未指定状态,这很可能意味着它不再指向任何内容。接下来,将lambda存储在一个容器中的一个线程中,该容器在函数return之后仍然存在。因此,当线程被连接时,lambda中的fileHandler
是一个悬空引用,指向一个不存在的值,即使在它确实存在的日子里也已经从中移动了。请注意std::move(fileHandler)
。您尝试在之后立即访问它。尝试使用fileHandlers.back()
获取最新的文件处理程序。推回移动的处理程序后,您的fileHandler
仍处于未指定状态,这很可能意味着它不再指向任何内容。接下来,将lambda存储在一个容器中的一个线程中,该容器在函数return之后仍然存在。因此,当线程被连接时,lambda中的fileHandler
是一个悬空引用,指向一个不存在的值,即使在它确实存在的日子里,该值也已经被移动了。您能提供代码示例吗?由于我来自Java环境,我不确定我是否正确理解了所有内容。您能提供cod吗