在不同的线程上发送和接收
send and recv on different threads
本文关键字:线程 更新时间:2023-10-16
我正在开发一个基本的配对服务器。基本过程如下:
- 客户端连接到服务器,报告客户端的名称和他们正在寻找的匹配类型
- 服务器报告所有可能的匹配
- 客户端选择他/她想要配对的匹配
- 服务器匹配两个客户端
问题是每次客户端连接时,我需要报告所有可能匹配的新客户端,并报告所有可能匹配的新连接客户端(因此,当不匹配的客户端必须始终准备好从服务器recv
)。同时,客户端可以在任何时候选择一个匹配,或者断开连接(因此客户端必须始终准备好send
,服务器必须准备好recv
)
我怀疑这个问题的真正解决方案是使用线程,一个客户端和服务器的后台recv
线程,一个主要的用户交互send
线程。
我有两个问题:
- 是保存到
send
和recv
与相同的套接字连接同时在不同的线程? - 这是正确的处理方法吗?
(标记为c++和obj-c,因为服务器是用c++构建的,客户端是obj-c)
是的,使用同一个套接字在一个线程上使用recv()
和在另一个线程上使用send()
是安全的。
服务器端,只有当有相对较少的客户端同时连接到服务器时,使用专用线程才能有效地工作。如果可伸缩性是一个问题,您需要使用异步I/O,甚至如果可能的话,使用I/O完成端口来管理单个线程上的多个客户机,将所需的线程数量保持在最低限度。
在任何合理的套接字库实现中都是安全的。这也是正确的做法。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 用于矢量处理的多个线程
- C++为线程工作动态地分割例程
- 为什么我不能在 while 循环中创建线程?