gpt4 book ai didi

c++ - 如何从析构函数(在多线程环境中)正确取消 Boost deadtime_timer?

转载 作者:行者123 更新时间:2023-12-02 10:15:27 25 4
gpt4 key购买 nike

我有一门课叫 Timer它公开了两个名为 start 的方法和 stop .

void Timer::start() {
_enabled.store(true, std::memory_order::memory_order_release);
_timer.expires_from_now(_delay);
_timer.async_wait(
std::bind(
&Timer::tick,
this,
std::placeholders::_1
));
}

void Timer::stop() {
_enabled.store(false, std::memory_order::memory_order_release);
_timer.cancel();
}

void Timer::tick(const boost::system::error_code& error) {
if (error) return;
if (!_enabled.load(std::memory_order::memory_order_acquire)) return;
try {
_task();
} catch (...) {}
if (_enabled.load(std::memory_order::memory_order_acquire)) {
_timer.expires_from_now(_delay);
_timer.async_wait(
std::bind(
&Timer::tick,
this,
std::placeholders::_1
));
}
}

另一个使用 Timer 实例的类(处理程序在 ThreadPool 实例中的某个其他线程上执行)调用 stop在它的析构函数中。来自 Boost Documentation ,现在可能会调用处理程序并且这两个函数将同时执行并且处理程序可能会尝试访问已释放的资源。

SomeOtherClass::~SomeOtherClass() {
_timer.stop();
// somehow wait for _timer handler to execute
// delete[] some_thing;
// other destructive things
}

无论如何要等待处理程序完成执行?我整天都在摸不着头脑,我对 Boost 很陌生,所以也许我犯了一个设计缺陷。任何帮助将不胜感激,谢谢。

最佳答案

一种模式是在您的 Timer 上添加一个 shared_ptr (通过使用 std::enable_shared_from_this )。

这样,只要处理程序尚未执行,您就可以保持计时器处于事件状态(通过保留绑定(bind)到处理程序的共享指针的拷贝)。

其他解决方案可能是:

  • 具有外部分配的计时器(例如,在具有引用稳定性的容器中,如 std::list )在不再需要它们时手动删除它们
  • 运行专用 io_service在你自己的线程上,所以你可以join等待 io_service 上工作的线程.

  • 根据您的用例/负载模式,一种方法会比其他方法更好。

    sample :
  • 使用 std::list使用参与异步操作的服务对象管理对象的生命周期(在本例中为 session :How to pass a boost asio tcp socket to a thread for sending heartbeat to client or server
  • 使用 shared_from_this改为:Simple server using Boost.Asio throws an exception
  • 为循环回调封装一个计时器并使用局部变量进行生命周期管理:C++ boost asynchronous timer to run in parallel with program

  • 我选择了具有一些对比方法的答案(有些不使用 Boost Asio),因此您可以看到权衡取舍以及方法之间的变化。

    关于c++ - 如何从析构函数(在多线程环境中)正确取消 Boost deadtime_timer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62144138/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com