删除不同线程中的对象会导致崩溃吗?

时间:2018-10-29 22:20:16

标签: c++ multithreading class

我有一个主线程,可以在其中创建一些自包含的类实例。

实例本身包含大量数据,需要经常删除和重新创建。实际删除它们需要一段时间(100k实例包含大量数据==较长的删除时间),因此我的想法是将它们的删除工作卸载到单独的线程中,因此允许UI在它们处于响应状态时保持响应被删除并清除内存。

以下是一些伪代码,显示了我要删除的类:

X1 = c(4)
X2 = c(5)
b = data.frame(X1,X2)

predict(svm_model, b)

下面是一些伪代码,以显示默认的阻止删除方法如何工作:

class myObj
{
    std::vector<int> bigData; //eventually filled with lots of data
};

但是当我以这种方式删除内容时,我的程序崩溃了。为什么?

void deleteStuff (std::vector<myObj*> *objects) //this works fine
{
    for (auto obj : *objects)
    {
        delete obj;
    }
    objects->clear();
}

值得注意的是,一旦deleteStuff返回,“对象”向量就再也不会被触及,因此这不是在线程中被清除的“对象”与在其他地方被访问之间的竞争情况。同样有时候,当我单步执行代码时,“ deleteStuffThreaded”函数在进入“ clear”行之前会崩溃。

Google告诉我,从理论上讲,可以在与创建线程不同的线程中删除对象,并且我知道崩溃不是由于返回“ deleteStuff”后尝试访问已删除对象之一的属性而引起的,因为单线程版本可以正常工作(并且我已经检查了我的代码,这些实例再也不会被触及)。

1 个答案:

答案 0 :(得分:2)

std::thread析构函数文档说:

  

〜thread(); (自C ++ 11起)

     

销毁线程对象。

     

如果*这具有关联的线程(joinable()== true),   std :: terminate()被调用。

因此,由于您尚未加入或分离线程,因此该程序将在您的deleteStuff函数结束并且调用线程对象的析构函数时终止

由于您可能想触发并忘记线程,因此请执行以下操作:

std::thread deleteThread(&deleteStuffThreaded, objects);
deleteThread.detach();