4

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

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

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

//编辑

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

4

2 回答 2

4

asio 背后的一个关键思想就是您不需要多个线程来处理多个客户端会话。您的描述有点笼统,我不确定我是否理解您所说的“我希望在没有任何同步和顺序的情况下进行客户端的读写操作”是什么意思。

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

于 2012-11-27T00:09:46.067 回答
1

在工作中,我们在做一些概念上非常相似的事情,在那里我注意到重型处理程序对性能的巨大影响。code/write handler的写端工作量太大,占用工作线程的时间过长,从而危及程序流程。尤其是 RST 数据包(关闭的连接)没有被读取处理程序足够快地检测到,因为写入操作占用了它们的甜蜜时间并占用了工作线程中的大部分处理时间。目前我通过创建两个工作线程来解决这个问题,这样一行代码就不会因为处理时间而变得匮乏。诚然,这远非理想,它在我冗长的待办优化列表中。

长话短说,如果您的处理程序是轻量级的,而第二个线程处理程序的其余部分,您可以使用单个线程进行读取和写入。一旦您注意到奇怪的同步问题,就该减轻您的网络处理程序或向工作池添加一个额外的线程了。

于 2015-03-09T20:42:36.213 回答