C++事件处理

C++事件处理,c++,events,boost,boost-asio,C++,Events,Boost,Boost Asio,我将优秀的asio用于异步网络客户端。在处理read async_read时,我担心处理数据的方法/函数可能会挂起或花费太长时间,因为函数是由类的用户提供的 调用提供的函数并确保不会花费太长时间的最佳方法是什么 谢谢您的时间。您可以编写一个包装函数,在单独的线程中启动给定的处理程序,并对其进行定时连接。如果超时达到,您可以抛出异常或执行任何您想要的操作。您可以编写一个包装函数,在单独的线程中启动给定的处理程序,并对其进行定时连接。如果超时达到,您可以抛出异常或执行任何您想要执行的操作。boost

我将优秀的asio用于异步网络客户端。在处理read async_read时,我担心处理数据的方法/函数可能会挂起或花费太长时间,因为函数是由类的用户提供的

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


谢谢您的时间。

您可以编写一个包装函数,在单独的线程中启动给定的处理程序,并对其进行定时连接。如果超时达到,您可以抛出异常或执行任何您想要的操作。

您可以编写一个包装函数,在单独的线程中启动给定的处理程序,并对其进行定时连接。如果超时达到,您可以抛出异常或执行任何您想要执行的操作。

boost文档提供了几个示例,描述了您想要完成的操作


请在标题为超时的部分下查找示例。

boost文档提供了几个示例,描述了您想要实现的目标


请在标题为“超时”的部分下查找示例。

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


有一本关于生产者/消费者使用Boost.Thread的入门书——由Boost Threads库的当前作者编写,作为奖励。

除非处理程序所做的工作在现实世界的应用程序中非常短暂,您需要生产者/消费者队列将从I/O线程接收到的数据传递给工作线程进行进一步处理,以便您可以尽快从处理程序返回


有一本关于生产者/消费者使用Boost.Thread的入门书,由Boost Threads库的当前作者编写,作为奖励。

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

另一种可能适用于您的线程方案是在io_服务上启动其他线程。这些额外的线程将使同时处理多个处理程序成为可能

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连接,则所有下注都将关闭,因为无法保证接收消息的顺序。

处理回调处理的额外线程是一个好主意。如上所述,让回调函数将消息推送到线程安全队列上,让另一个线程使用/处理该消息非常有效

另一种可能适用于您的线程方案是在io_服务上启动其他线程。这些额外的线程将使同时处理多个处理程序成为可能

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连接,则所有赌注都将关闭,因为无法保证接收消息的顺序。

这非常有趣。如何在另一个线程中启动函数/方法?@nc3b:创建boost::thread类的实例,并将函数/方法作为参数传递。上面提到的timed_join是boost::thread类的成员。@Armen Tsirunyan:我可以这样做,但是为收到的每个数据包生成另一个线程可能会有点影响性能hit@nc3b:很好,另一方面,您可以优化此想法,例如使用线程池,在这种情况下,您不必一直产生新线程time@n3cb:是,例如使用条件变量。基本上,如果您阅读boost::thread的文档,您将得到所有答案,包括如何生成/操作线程以及如何进行同步。这非常有趣。如何在另一个线程中启动函数/方法?@nc3b:创建boost::thread类的实例,并将函数/方法作为参数传递。上面提到的timed_join是boost::thread类的成员。@Armen Tsirunyan:我可以这样做,但是为收到的每个数据包生成另一个线程可能会有点影响性能hit@nc3b:说得好,另一方面,你可以
优化这个想法,例如使用一个线程池,在这种情况下,您不必一直产生新的线程time@n3cb:是,例如使用条件变量。基本上,如果你阅读boost::thread的文档,你会得到所有的答案,包括如何生成/操作线程以及如何进行同步。你能更具体一点吗?我是个新手,一点指导会很有帮助。你能更具体一点吗?我对boost很陌生,一点指导会很有帮助。谢谢你,这看起来很棒:@nc3b-我对boost的这些部分说得不够好。谢谢你,这看起来很棒:@nc3b-我对boost的这些部分说得不够好。谢谢你的建议,由于消息是按顺序处理的,因此我使用的是生产者/消费者模型。谢谢您的建议,我使用的是生产者/消费者模型,因为消息是按顺序处理的。