超时后在哪里销毁线程和deadline_timer对象?

时间:2011-09-14 08:27:19

标签: c++ multithreading boost boost-asio

我的问题是关于一个正在运行的截止日期计时器,它等待由相同的函数表示的某些操作完成:但我不知道,在安全完成后,在哪里释放我的线程和截止日期对象在截止时间之前中断。什么时候能发生?

boost::asio::deadline_timer* mDeadline1;
boost::asio::deadline_timer* mDeadline2;
boost::thread* mThread1;
boost::thread* mThread2;

// start deadline timers
mDeadline1 = new boost::asio::deadline_timer(_io_service, boost::posix_time::seconds(2));
mDeadline1->async_wait(&MyClass::DeadlineTimedOut, this);

mDeadline2 = new boost::asio::deadline_timer(_io_service, boost::posix_time::seconds(2));
mDeadline2->async_wait(&MyClass::DeadlineTimedOut, this);


// Run operations in threads
mThread1 = new boost::thread(&MyClass::DoSomething, this);
mThread2 = new boost::thread(&MyClass::DoSomething, this);
// ...

void MyClass::DoSomething() {
  // Do something time expensive and sleep, etc. for interrupt point ...

  // which to cancel here!?
  mDeadline->cancel();
  delete mDeadline;
}

void MyClass::DeadlineTimedOut(const boost::system::error_code& pErrorCode) {
  if(pErrorCode == 0) { // deadline timed out

    // which to interrupt here?
    mThread->interrupt();
  }

  if(pErrorCode == 995) { // deadline cancelled from outside

  }
}

有人有什么建议吗?优雅,B。

1 个答案:

答案 0 :(得分:2)

他们站立的计时器毫无意义 - 只有你知道他们的意思和他们应该做什么 - 所以你必须决定取消什么。至于清理,请将它们保存在scoped_ptrshared_ptr中,并在范围/最后一次引用完成后自动清理它们。