当前位置: 首页 > 知识库问答 >
问题:

执行时使用Boost::ASIO::deadline_timer时出错

郑光济
2023-03-14

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

          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)

共有1个答案

蒯宇定
2023-03-14

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

也就是说,关于异步,可能出错的所有事情都在出错:

>

  • 您存在内存泄漏(state是拥有的指针成员,但您默认了析构函数?https://www.google.com/search?q=CPPreference+rule+of+three&ampoq=CPPreference+rule+of+three&ampaqs=chrome..69i57j69i64.2928j0j7&ampsourceID=chrome&ampie=UTF-8)

    这是UB:

         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)));
    

    async_立即返回,但操作是异步运行的。 在您的示例中,T是一个局部变量,在构造函数返回后立即超出作用域。 所以,那是行不通的。

    start_heartbeats中的问题完全相同

    (假设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下运行干净

  •  类似资料:
    • 根据http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/cpp2011/futures.html,我们可以将boost::asio与一起使用。但是我找不到任何有关使用的信息,它具有更多的功能,例如。我怎么用?

    • 我在Ubuntu 18.04上,g -8编译器找不到libboost-asio模块。然而,我用 每当我试图用下面的头文件进行编译时 我被抛出一个编译器错误,说头文件无法找到。 我能够使用其他boost头进行编译,例如boost/array。hpp,但与asio无关。 在libbooost上运行版本检查 returns:版本:1.65.1.0ubuntu1 我也找不到任何asio使用倾向的痕迹。我怀

    • 问题内容: 我希望一个非常简单的定期计时器每50毫秒调用一次我的代码。我可以使一个线程一直保持50ms的睡眠时间(但这很痛苦)……我可以开始研究Linux API来制作定时器(但它不是可移植的)…… 我 想 使用boost。我只是不知道这是可能的。Boost是否提供此功能? 问题答案: Boosts Asio教程中的第二个示例对此进行了解释。 你可以在这里找到它。 之后,请查看第三个示例,以了解如

    • 问题内容: 我试图从boost :: asio运行SSL示例,并且在运行它们时遇到“无效参数”异常。我在Linux x86_64上。 http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/ssl/client.cpp http://www.boost.org/doc/libs/1_46_1/doc/html/boost_a

    • 我想用pytesseract。这是我的密码。 结果我得到了这个错误 回溯(最后一次调用):文件“C:\Users\user\AppData\Local\Programs\Python 38-32\lib\site packages\pdf2image\pdf2image.py”,第409行,在pdfinfo\u from_path proc=Popen(命令,env=env,stdout=PIPE

    • 问题内容: 我目前正在尝试使用boost-asio的套接字API通过网络将一些JSON数据从客户端传输到服务器。我的客户基本上是这样做的: 在服务器端,我可以选择各种功能。我想使用JsonCpp解析接收到的数据。在研究JsonCpp API(http://jsoncpp.sourceforge.net/class_json_1_1_reader.html)时,我发现Reader可以在char数组或

    • 我正在尝试用Boost::ASIO实现NAT打孔。根据我的理解,NAT穿孔器的工作原理是这样的(UDP/TCP): 客户端A绑定到端口并连接到服务器S,客户端B执行相同操作。 当S同时接收到请求和匹配时,它将A的ip和端口发送给B,B发送给A。 a和B接收对方的ip和端口,现在它们从同一端口向对方发送消息并形成连接(因为它们正在等待回复?) 如果没有成功的或,我似乎无法运行任何。当然,当目标端口没