【问题标题】:Reusing a detached thread [closed]重用分离的线程[关闭]
【发布时间】:2018-03-17 15:38:26
【问题描述】:

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

我了解分离的线程在完成后会自动释放其所有资源,但在我的情况下不会。我使用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

【问题讨论】:

  • bool CFileExtract::execute() 你没有在这里传递任何参数,那么你如何重新初始化向量?还有什么返回 bool 应该确认?
  • 如何以及何时重新运行某个线程?我没有在代码中看到第二次运行。
  • @Olaf,整个任务再次运行。意思是,“vec”再次用新值重新填充,然后成员函数“bool CFileExtract::execute()”再次运行。

标签: c++ multithreading concurrency


【解决方案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();

【讨论】:

  • 很抱歉打扰了各位!已经发现问题了。每当我在重新运行“copy_thread”之前断言“vec”的内容时,我未能重置一些标志是的,分离的线程在线程完成后会释放资源。
  • 是的,分离线程在线程完成执行后会释放资源
  • 是的,传递副本是另一种方式,但行为是相同的,只是因为我未能重置该标志。
猜你喜欢
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多