我有一个将文件从源文件复制到新位置的线程,我从类中运行此线程并被分离。线程正在运行并且正常结束但是当我重新运行副本(没有重新启动程序)时,使用不同的源和位置,线程按预期运行但仍然使用旧的源和位置。
我知道分离的线程一旦完成就会自动释放所有资源,但在我的情况下却没有。我使用std::move(vec)
将值传递给线程。这里似乎没有在线程完成后释放v
。
有人可以帮助我进一步了解多线程。
std::vector <FILEEXTRACTPARAMS> vec; //class wide variable
.
.
.
bool CFileExtract::execute()
{
//initialization/re-initialization of 'vec' here
.
.
std::thread cp_th(©_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
答案 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();