我正在尝试编写一个类,该类将在创建对象时运行线程,并在对象被删除后停止线程。
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 *
*******************************************/
}
}
};
从理论上讲,我想在线程需要完成时立即唤醒它,所以我不得不使用 timed_wait 而不是 Sleep。在我尝试删除此类的对象之前,这工作正常。在大多数情况下,它会正常删除,但偶尔会在 condition_variable.hpp、thread_primitives.hpp 或 crtexe.c 中导致错误。有时我会收到通知“释放堆块 3da7a8 在 3da804 被释放后修改”,有时我不是。是的,我知道 timed_wait 的虚假唤醒,在这种情况下它并不重要。你能指出我的问题的根源吗?我究竟做错了什么?