所以,标题听起来很疯狂,我认为代码可以更好地理解我的问题
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效果很好,但看起来很糟糕。
答案 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)
分配和解除分配不应由两个独立的实体负责,在两个独立的线程中最差。我们希望以对称方式查看new
和delete
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
。