Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在线程中将变量正确地传递给lambda函数_C++_Multithreading_Lambda - Fatal编程技术网

C++ 如何在线程中将变量正确地传递给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

这段代码有漏洞。我知道我错误地将对象传递给向量和lambda函数,但我不确定如何解决这个问题。你能给我一些代码检查和修改吗

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吗