提升asio - 同时阅读和写作

时间:2012-11-26 23:13:06

标签: c++ multithreading thread-safety boost-asio

我正在尝试使用boost实现双向通信:asio。我正在编写将与多个客户端通信的服务器。

我希望客户端的写入和读取在没有任何同步和顺序的情况下发生 - 客户端可以随时向服务器发送命令,并且它仍然在循环中接收一些数据。当然,必须保护对共享资源的访问。

实现这一目标的最佳方法是什么?有两个线程 - 一个用于阅读,一个用于写一个好的选项?接受连接和管理许多客户端怎么样?

//修改

“没有同步和顺序”我的意思是服务器应该始终向客户端传输其数据,并且它可以随时响应(改变其行为)客户端请求,而不管现在发送给他们的是什么

2 个答案:

答案 0 :(得分:4)

asio背后的一个关键想法是,您不需要多个线程来处理多个客户端会话。你的描述有点泛泛,我不确定我是什么意思'我希望客户的写入和读取在没有任何同步和命令的情况下发生'。

一个很好的起点是asio chat server示例。请注意,在此示例中,如何为每个连接的客户端创建类chat_session的实例。只要连接处于活动状态,该类的对象就会继续发布异步读取,同时它们可以将数据写入连接的客户端。同时,类chat_server的对象不断接受新的传入客户端连接。

答案 1 :(得分:1)

在工作中我们做的事情在概念上非常相似,我注意到重型处理程序对性能的影响很大。代码/写入处理程序的写入方面做了太多工作并且占用工作线程太长时间,从而危及程序流程。特别是读取处理程序没有足够快地检测到RST数据包(闭合连接),因为写入操作正在花费他们的甜蜜时间并占用工作线程中的大部分处理时间。目前我通过创建两个工作线程来解决这个问题,这样一行代码就不会缺乏处理时间。不可否认,这远非理想,而是在我冗长的优化列表中。

长话短说,如果您的处理程序重量轻,而第二个线程处理您的程序的其余部分,则可以使用单个线程进行读取和写入。一旦你发现奇怪的同步问题,它就可以点亮网络处理程序或为工作池添加额外的线程。