1つのスレッドがすでにタイムアウトハンドラー内にあるときに、コンテキストスイッチ中に期限タイマーが破棄されるとどうなりますか?
たとえば、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()
}
}