重用分离的线程

时间:2018-03-17 15:38:27

标签: c++ multithreading concurrency

我有一个将文件从源文件复制到新位置的线程,我从类中运行此线程并被分离。线程正在运行并且正常结束但是当我重新运行副本(没有重新启动程序)时,使用不同的源和位置,线程按预期运行但仍然使用旧的源和位置。

我知道分离的线程一旦完成就会自动释放所有资源,但在我的情况下却没有。我使用std::move(vec)将值传递给线程。这里似乎没有在线程完成后释放v

有人可以帮助我进一步了解多线程。

std::vector <FILEEXTRACTPARAMS> vec; //class wide variable
.
.
.
bool CFileExtract::execute()
{
    //initialization/re-initialization of 'vec' here
    .
    .
    std::thread cp_th(&copy_thread, std::move(vec));
    cp_th.detach();
    .
    .
}
.
.
.
void copy_thread(std::vector <FILEEXTRACTPARAMS> &&v)
{   
    for (size_t sz = 0; sz != v.size(); sz++)
    {
        .
        //some tasks done here
        .
    }
}//end of thread

1 个答案:

答案 0 :(得分:1)

问题似乎是在运行之间缺少std::vector::clear() vec

声明rvalue reference参数不会神奇地创建副本,您仍然可以引用某个对象。在这种情况下,它是对vec的引用。

如果您想要一个自动清理的副本,请按值传递参数,例如

void copy_thread(std::vector<FILEEXTRACTPARAMS> v)
{   
    // use v here
}

然后将其称为

std::thread cp_th(copy_thread, std::move(vec));
cp_th.detach();