boost :: asio超时示例 - 写入数据很昂贵

时间:2011-03-14 14:41:07

标签: boost-asio

boost :: asio提供了一个如何使用库来实现异步超时的示例;客户端向服务器发送服务器定期心跳消息,将心跳回送给客户端。在N秒内未能响应会导致断开连接。请参阅boost_asio / example / timeouts / server.cpp 这些例子中概述的模式将是我即将开展的项目的一部分的一个很好的起点,但是对于一个皱纹: 除了心跳之外,客户端和服务器都需要相互发送消息。 超时示例将心跳回显消息推送到队列,后续超时导致超时的异步处理程序实际将数据写入套接字。

在运行io_service的线程上无法为要写入的套接字引入数据,因为它在run()上被阻止。 run_once()没有帮助,你仍然会阻塞,直到有一个运行处理程序,并介绍管理io_service工作的复杂性。 在asio中,异步处理程序 - 对作为其中之一的套接字的写入 - 在运行io_service的线程上调用。

因此,要随机引入消息,要发送的数据将从io_service线程以外的线程推送到队列,这意味着使用互斥锁保护队列和通知计时器。每个消息有两个互斥锁,一个用于将数据推送到队列,另一个用于处理程序,用于将数据出列以写入套接字。

这实际上是一个比asio超时更普遍的问题:是否存在一种模式,当io_service线程在run()上被阻塞时,通过该模式可以异步地将数据写入套接字而不需要为每个消息提取两个互斥量?

1 个答案:

答案 0 :(得分:1)

以下事情可能很有意义:boost::asio strands是一种同步处理程序的机制。如果你从多个线程AFAIK调用io_service :: run,你只需要这样做。

同样有用的是io_service::post方法,它允许您从调用io_service :: run的线程中执行代码。