2011-03-14 33 views
0

的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线程时,可以通过哪种方式将数据异步写入套接字,而不必每个消息都使用两个互斥锁?

+0

我不知道为什么你需要两个互斥,不要你只需要一个保护的消息队列中。该io_service已发送消息的情况下。至于处理程序,您可以使用相同的互斥锁来保护队列。除非你调用io_service ::从多个线程运行? – Ralf 2011-03-14 15:12:36

回答

1

下面的事情可能会感兴趣:boost::asio strands是同步处理的机制。你只需要这样做,但如果你调用io_service ::从多线程AFAIK运行。

也有用的是io_service::post方法,它允许你从调用io_service :: run的线程执行代码。

+0

感谢您的信息。在问这个问题之前,我先看了一下这些问题; post方法似乎没有帮助,因为处理程序的签名必须是void处理程序(void);没有数据可以传入。我需要更仔细地观察链,但是将数据写入队列不会发生在处理程序中,因此链如何帮助? – user658878 2011-03-14 15:12:21

+0

您可以使用boost :: bind(http://www.boost.org/doc/libs/release/libs/bind/bind.html)将任意数据绑定到方法。 – Ralf 2011-03-14 15:14:33

+0

一个很好的建议,这可能是答案。谢谢 – user658878 2011-03-14 15:17:57