C ++事件处理

时间:2010-10-19 19:38:37

标签: c++ events boost boost-asio

我使用优秀的asio作为异步网络客户端。处理read(async_read)时,我担心处理数据的方法/函数可能会挂起或耗时太长(该函数由类的用户提供)。

调用提供的函数的最佳方法是什么,确保它不会花费太长时间?

感谢您的时间。

4 个答案:

答案 0 :(得分:1)

你可以编写一个包装器函数,它在一个单独的线程中启动给定的处理程序并在其上执行timed_join。如果达到超时,你可以抛出异常或做任何你想做的事情。

答案 1 :(得分:1)

boost文档提供了几个描述您想要完成的内容的示例。

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

查看示例中标题为超时的部分。

答案 2 :(得分:1)

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

使用Boost.Thread here生成者/消费者的入门书 - 由Boost Threads库的当前作者撰写,作为奖励。

答案 3 :(得分:1)

处理回调处理的额外线程是一个好主意。如上所述,让你的回调将消息推送到线程安全队列,另一个使用/处理消息的线程运行良好。

另一个可能对您有用的线程方案是在io_service上启动其他线程。这些额外的线程可以同时处理多个处理程序。

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连接,则无论如何都会关闭所有投注,因为无法保证收到的消息的排序。