从这个objecs的方法开始,从线程中销毁类对象的最佳实践

时间:2015-12-18 15:51:42

标签: c++ multithreading c++11 memory-management shared-ptr

所以,标题听起来很疯狂,我认为代码可以更好地理解我的问题

class Class
{
public:
    static void* thread_func(void *thisObject)
    {
        // do some work
        delete thisObject; // cleanup

    }

    start_thread()
    {
        auto worker = std::thread(thread_func, this);
        worker.detach();
    }
}; 

如何使用此课程

Class *p = new Class;

p->start_thread(); // start some work in parralel and return from function

因此,我需要在完成thread_func后删除已分配的对象。实施此类行为的最佳方式是什么?如代码示例所示,从线程函数中删除thisObject效果很好,但看起来很糟糕。

5 个答案:

答案 0 :(得分:1)

你真的不能这样做。首先,你没有阻止任何人从堆栈中分配你的类的实例。你可以做到这一点,但它可能只会导致更多问题。

相反,使您的线程功能只是删除类中保存的内部资源。但不是班级的实例。如果需要,您可以将您的班级拆分为两个 - 一个用于管理删除另一个保持真实状态的班级。

答案 1 :(得分:1)

当你使用c ++ 11时,使用lambda - 然后不用担心任何事情..

class foo
{
public:
  void run() {
    // Do something..
  }
};

int main(void) {
  foo f;
  // construct and run the thread...
  auto t = std::thread([&f]() { f.run(); });
}

答案 2 :(得分:1)

分配和解除分配不应由两个独立的实体负责,在两个独立的线程中最差。我们希望以对称方式查看newdelete s。那么,你应该使用智能指针:

class Class
{
    static void* thread_func(std::shared_ptr<Class> self)
    {
        // do some work
    }
public:
    static void start_thread(std::shared_ptr<Class> self)
    {
        auto worker = std::thread(thread_func, self);
        worker.detach();
    }
};

如何使用此课程:

{
    Class::start_thread(new Class);
}

答案 3 :(得分:0)

简单地删除工作线程中的对象是一个坏主意,因为你的线程不知道如何分配对象:可以使用new创建int,new中的pl malloc内存,某些分配器,堆栈,静态内存等等。

您可以向thread_func添加回调参数。在您的用例中,您只需传递一个删除对象的功能。但是如果需要的话,你可以通过funntions做你想做的任何事情。

答案 4 :(得分:0)

我认为这是一个使用std::shared_ptr的好地方,在您创建对象的范围内,使用std::weak_ptr

http://en.cppreference.com/w/cpp/memory/weak_ptr