当一个线程已经在超时处理程序中时,在上下文切换期间销毁截止时间计时器会发生什么?
例如,如果在 TimerCallback 执行期间,上下文切换到另一个线程删除了 ScheduledCommand?
ScheduledCommand::ScheduledCommand(
const boost::shared_ptr<CommandInterface> command,
const boost::posix_time::time_duration timeTillExecution):
mTimer(TheCommandTimerThread::instance()->IoService(), timeTillExecution),
mCommand(command)
{
mTimer.async_wait(boost::bind(&ScheduledCommand::TimerCallback,
this,
boost::asio::placeholders::error));
}
ScheduledCommand::~ScheduledCommand()
{
Cancel();
}
void ScheduledCommand::TimerCallback(const boost::system::error_code& error)
{
if (!error)
{
assert(mCommand);
mCommand->Execute();
}
}
上述代码在 mCommand->Execute() 处存在分段错误。GDB 分析显示 mCommand 无效。可能从另一个线程中删除。谢谢。
编辑:
为什么以下更改不能解决此问题?
ScheduledCommand::Cancel()
{
if (mTimer.cancel() == 0)
{
mTimer.wait()
}
}