オブジェクトの作成時にスレッドを実行し、オブジェクトが削除されるとスレッドを停止するクラスを作成しようとしています。
class MyThread : public boost::thread {
public:
MyThread() : bAlive(true) {
boost::thread(&MyThread::ThreadFunction,this);
}
~MyThread() {
{
boost::unique_lock<boost::mutex> lock(Mutex);
bAlive=false;
}
ConditionVariable.notify_one();
join();
}
private:
volatile bool bAlive;
boost::mutex Mutex;
boost::condition_variable ConditionVariable;
void ThreadFunction() {
boost::unique_lock<boost::mutex> lock(Mutex);
while(bAlive) {
ConditionVariable.timed_wait(lock,boost::get_system_time()+ boost::posix_time::milliseconds(MAX_IDLE));
/*******************************************
* Here goes some code executed by a thread *
*******************************************/
}
}
};
理論的には、スレッドが終了する必要があるとすぐにスレッドをウェイクアップしたいので、Sleep の代わりに timed_wait を使用する必要がありました。このクラスのオブジェクトを削除しようとするまで、これは正常に機能します。ほとんどの場合、正常に削除されますが、場合によっては、condition_variable.hpp、thread_primitives.hpp、または crtexe.c のいずれかでエラーが発生します。「解放された後、3da804 で変更された Free Heap block 3da7a8」と通知されることもあれば、通知されないこともあります。はい、私は timed_wait の偽のウェイクアップを認識しています。この場合、それは重要ではありません。問題の原因を教えてください。私は何を間違っていますか?