代码之家  ›  专栏  ›  技术社区  ›  nc3b

C++事件处理

  •  1
  • nc3b  · 技术社区  · 14 年前

    我在用优秀的 asio 对于异步网络客户端。处理读取时( async_read )我担心处理数据的方法/函数可能挂起或花费太长时间(该函数由类的用户提供)。

    调用所提供函数的最佳方式是什么

    谢谢你抽出时间。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Armen Tsirunyan    14 年前

    您可以编写一个包装函数,该函数在单独的线程中启动给定的处理程序并对其执行定时连接。如果超时时间到了,你可以抛出一个异常或者做任何你想做的事情。

        2
  •  1
  •   diverscuba23    14 年前

    boost文档提供了几个示例,描述了您想要完成的任务。

    http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/examples.html

    在“超时”部分下面查看示例。

        3
  •  1
  •   Steve Townsend    14 年前

    除非您的处理程序所做的工作非常短暂(在实际应用程序中不太可能),否则您将希望生产者/消费者队列将从I/O线程接收到的数据交给您的工作线程进行进一步处理,以便您可以尽快从处理程序返回。

    对于使用Boost.Thread的生产者/消费者有一个入门知识 here -作为奖励,由Boost线程库的当前作者编写。

        4
  •  1
  •   skimobear    14 年前

    一个额外的线程来处理回调处理是一个好主意。如上所述,让回调将消息推送到线程安全队列中,而另一个线程使用/处理该消息,效果很好。

    const int max_threads = 5;
    boost::asio::io_service ios;
    boost::thread_group thread_group;
    
    for (int i = 0 ; i < max_threads; ++i)
      thread_group.create_thread( boost::bind(&boost::asio::io_service::run, boost::ref(ios)) );
    

    正确的解决方案实际上取决于应用程序在做什么。如果这是一个TCP连接,并且需要按顺序处理消息,请考虑使用生产者/消费者队列。如果消息彼此独立并且不要求按顺序处理它们,那么这种方法也适用。

    如果是UDP连接,则所有下注都将关闭,因为无法保证接收的消息的顺序。