gpt4 book ai didi

c++ - 可以在从 Thread 类继承的对象上使用 "delete this;"吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:05:30 25 4
gpt4 key购买 nike

一般来说,如果你有一个继承自 Thread 类的类,并且你希望该类的实例在完成运行后自动释放,可以删除这个吗?

具体例子:

在我的应用程序中,我有一个 Timer 类,其中包含一个名为 schedulestatic 方法。用户这样调用它:

Timer::schedule((void*)obj, &callbackFunction, 15); // call callbackFunction(obj) in 15 seconds

schedule 方法创建一个Task 对象(其目的类似于 Java TimerTask 对象)。 Task 类是 Timer 类的私有(private),继承自 Thread 类(用 pthreads 实现) .所以 schedule 方法是这样做的:

Task *task = new Task(obj, callback, seconds);
task->start(); // fork a thread, and call the task's run method

Task 构造函数保存用于新线程的参数。在新线程中,调用任务的run方法,如下所示:

void Timer::Task::run() {
Thread::sleep(this->seconds);
this->callback(this->obj);
delete this;
}

请注意,我不能使 task 对象成为堆栈分配对象,因为新线程需要它。此外,我已将 Task 类设为 privateTimer 类以防止其他人使用它。

我特别担心,因为删除Task对象意味着删除底层的Thread对象。 Thread 对象中的唯一状态是 pthread_t 变量。有什么办法可以让它回来咬我?请记住,在 run 方法完成后,我不会使用 pthread_t 变量。

我可以通过引入某种状态来绕过调用 delete this(通过 Thread::start 方法的参数或 Thread 构造函数)表示派生的方法应该delete 它调用run 方法的对象。但是,代码似乎按原样工作。

有什么想法吗?

最佳答案

我认为“删除这个”是安全的,只要您之后不在 run() 方法中执行任何其他操作(因为所有任务对象的成员变量等都将在此时释放内存) .

不过我确实对您的设计感到疑惑……您真的希望每次有人安排计时器回调时都生成一个新线程吗?这对我来说似乎效率很低。您可能会考虑使用线程池(或者甚至只是一个持久性计时器线程,它实际上只是一个大小为 1 的线程池),至少作为以后的优化。 (或者更好的是,在根本不产生额外线程的情况下实现计时器功能......如果您使用具有超时功能的事件循环(如 select() 或 WaitForMultipleObjects()),则可以多路复用任意数量的独立线程单线程事件循环中的计时器事件)

关于c++ - 可以在从 Thread 类继承的对象上使用 "delete this;"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2227173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com