的boost :: ASIO提供了如何使用该库实现异步超时的例子。客户端向服务器发送服务器周期性心跳消息,该消息将心跳回传给客户端。在N秒内未能响应导致断开连接。见boost_asio /例子/超时/ server.cpp 在这些例子中列出将是一个项目,我将在短期内对工作的一部分,一个良好的起点的模式,但对于一个皱纹: 除了心跳,客户机和服务器需要互相发送消息。 超时示例将心跳回显消息推送到队列中,随后的超时会导致异常处理程序超时以实际将数据写入套接字。对于写插座的boost :: ASIO超时的例子 - 写数据是昂贵的
引入数据不能在线程中运行io_service对象来完成,因为它被封锁的run()。 run_once()没有帮助,直到有一个处理程序才能运行,并且引入管理io_service工作的复杂性。 在asio中,在运行io_service的线程上调用异步处理程序 - 写入其中一个套接字的异步处理程序。
因此,为了引进随机消息,要发送的数据是从比io_service对象线程以外的线程,这意味着保护队列和通知定时器互斥推到队列中。然后每条消息有两个互斥体,一个用于将数据推送到队列,另一个用于处理程序,将数据取出以写入套接字。
这实际上是一个比asio超时本身更为普遍的问题:有没有一种模式,当run()中阻塞io_service线程时,可以通过哪种方式将数据异步写入套接字,而不必每个消息都使用两个互斥锁?
我不知道为什么你需要两个互斥,不要你只需要一个保护的消息队列中。该io_service已发送消息的情况下。至于处理程序,您可以使用相同的互斥锁来保护队列。除非你调用io_service ::从多个线程运行? – Ralf 2011-03-14 15:12:36