gpt4 book ai didi

c++ - 在 boost::asio::io_service 上调用运行时崩溃

转载 作者:行者123 更新时间:2023-11-30 04:04:09 27 4
gpt4 key购买 nike

我正在尝试编写一个相对简单的类“CallbackTimer”,它需要一定的时间和一个函数,并且在经过一段时间后调用该函数。如有必要,可以重复几次。

一切都按预期工作,但是当我在计时器结束前多次调用 start 时偶尔会发生崩溃,但我看不出问题出在哪里。我认为这是因为我没有正确混合我的线程和 io_service,但我不确定。任何帮助或指点将不胜感激。

类如下

CallbackTimer::CallbackTimer(const std::function<void()>& callback) :
callback_(callback),
currentRepeats_(0),
//io_(boost::asio::io_service()),
timer_(new boost::asio::deadline_timer(io_)),
strand_(io_),
thread_(nullptr)
{
}

CallbackTimer::~CallbackTimer()
{
cancel();
}

void CallbackTimer::start(size_t intervalMillis, int repeats)
{
if (thread_)
{
cancel();
}

requestedRepeats_ = repeats;
intervalMillis_ = intervalMillis;
currentRepeats_ = 0;
runTimer();

thread_.reset(new std::thread([this]()
{
this->io_.run();
}));

thread_->detach();
}

void CallbackTimer::cancel()
{
timer_->cancel();

if (thread_ && thread_->joinable())
{
thread_->join();
}

io_.reset();
}

void CallbackTimer::runCallback(const boost::system::error_code& e)
{
if (e == boost::asio::error::operation_aborted)
{
io_.stop();
return;
}

currentRepeats_++;
callback_();

if (currentRepeats_ >= requestedRepeats_)
{
io_.stop();
return;
}

runTimer();
}

void CallbackTimer::runTimer()
{
timer_->expires_from_now(boost::posix_time::millisec(intervalMillis_));
timer_->async_wait(strand_.wrap(std::bind(&CallbackTimer::runCallback, this, std::placeholders::_1)));
}

最佳答案

快速浏览一下,有两个潜在的问题:

  • CallbackTimer 类无法保证 io_service::reset() 的先决条件当对 run()run_one()poll()poll_one() 有未完成的调用时不调用,导致未指定的行为。
  • CallbackTimer::runCallback() 可以在 CallbackTimer 实例的生命周期结束后调用,调用未定义的行为。

这两个问题都是由于与运行 io_service 的线程没有同步造成的。线程在 CallbackTimer::start() 中创建后分离,CallbackTimer::cancel() 中的 if 语句将始终为 false,导致不同步发生。这允许以下情况:

  • io_service::reset()thread_ 处于 io_service::run() 时被调用。
  • thread_io_service::run() 中时,拥有 io_serviceCallbackTimer 被释放。

要解决此问题,请考虑不再与 thread_ 分离,以便可能发生同步。

为了进一步调试,堆栈跟踪或 mcve可以帮助确定崩溃的确切来源。

关于c++ - 在 boost::asio::io_service 上调用运行时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23902046/

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