我使用优秀的asio
作为异步网络客户端。处理read(async_read
)时,我担心处理数据的方法/函数可能会挂起或耗时太长(该函数由类的用户提供)。
调用提供的函数和的最佳方法是什么,确保它不会花费太长时间?
感谢您的时间。
答案 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连接,则无论如何都会关闭所有投注,因为无法保证收到的消息的排序。