1

我正在尝试使用以下代码实现一个基本的截止时间计时器:

          class Example
          {
              Example(boost::asio::io_service& ios, config& cfg)
                        : ios_(ios), cfg_(cfg), tcp_client_(ios) {
    
                state = new State();
                boost::asio::deadline_timer t(ios, boost::posix_time::seconds(5));
                t.async_wait(boost::bind(&bse_dummy_exchange::start_heartbeats,this,boost::asio::placeholders::error,boost::ref(t)));
              }
              ~Example() = default;
              void start_heartbeats(const boost::system::error_code& e,boost::asio::deadline_timer& t)
              {
                  std::cout << "Hello, world!\n";
                  t.expires_from_now(boost::posix_time::seconds(5));
     t.async_wait(boost::bind(&bse_dummy_exchange::start_heartbeats,this,boost::asio::placeholders::error,boost::ref(t)));
              }
          }

编译很好,但是在执行时我收到了这个我不明白的错误消息,有人可以帮我解决一下吗:

    Hello, world!
    bse_dummy_exchange: ../nptl/pthread_mutex_lock.c:425: 
    __pthread_mutex_lock_full: Assertion `INTERNAL_SYSCALL_ERRNO (e, __err) 
    != ESRCH || !robust' failed.
    Aborted (core dumped)
4

1 回答 1

2

您没有显示互斥锁 - 所以我们无法回答。

也就是说,关于可能出错的异步,一切都会出错:

(我是为了理解你的代码,假设它Example实际上是命名的use_dummy_exchange

至少,定时器的生命周期需要超过 async_wait 的生命周期。

最小固定版本

当然,不修复与互斥错误相关的任何内容 - 不包括在内:

住在科利鲁

#include <boost/asio.hpp>
#include <iostream>
struct config { };

struct TcpClient {
    TcpClient(boost::asio::io_service& ios) : ios_(ios){}
  private:
    boost::asio::io_service& ios_;
};

struct Example {
    struct State {};
    std::unique_ptr<State> state;

    Example(boost::asio::io_service& ios, config& cfg)
        : state(std::unique_ptr<State>()),
          ios_(ios),
          cfg_(cfg),
          tcp_client_(ios)
    {
        heartbeats();
    }

    void heartbeats(const boost::system::error_code& e = {}) {
        std::cout << "Hello, world!" << std::endl;
        if (!e) {
            t.expires_from_now(boost::posix_time::seconds(5));
            t.async_wait([this](auto ec) { heartbeats(ec); });
        }
    }

  private:
    boost::asio::io_service& ios_;
    config cfg_;
    TcpClient tcp_client_;
    boost::asio::deadline_timer t{ios_};
};

int main() {
    boost::asio::io_service ios;
    config cfg;
    Example ex(ios, cfg);

    ios.run_for(std::chrono::seconds(12));
}

印刷

Hello, world!
Hello, world!
Hello, world!

它没有内存泄漏,并且在 UBSan/ASan 下运行干净

于 2020-06-30T15:04:40.743 回答