一般に、あるクラスを継承するクラスがあり、そのクラスのインスタンスが実行終了後に自動的に割り当てを解除Thread
されるようにしたい場合、delete this
具体例:
私のアプリケーションには、 という1 つのメソッドを持つTimer
クラスがあります。ユーザーは次のように呼び出します。static
schedule
Timer::schedule((void*)obj, &callbackFunction, 15); // call callbackFunction(obj) in 15 seconds
このschedule
メソッドはTask
オブジェクトを作成します (目的は Java TimerTask オブジェクトに似ています)。Task
クラスはクラスに対するprivate
ものであり、Timer
クラスから継承します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
クラスprivate
をTimer
クラスにしました。
Task
オブジェクトを削除するということは、基になるオブジェクトを削除することを意味するため、特に心配していThread
ます。Thread
オブジェクトの唯一の状態はpthread_t
変数です。これが戻ってきて私を噛む方法はありますか?メソッドが終了pthread_t
した後は変数を使用しないことに注意してください。run
(メソッドへの引数またはコンストラクター内の何かdelete this
を介して) ある種の状態を導入することにより、呼び出しをバイパスすることができます。これは、メソッドを呼び出しているオブジェクトに対してフォークされるメソッドであることを示します。ただし、コードはそのまま動作するようです。Thread::start
Thread
delete
run
何かご意見は?