我们有一个服务器,每个游戏区域需要 1 个 UDP 连接,并且每个都在自己的线程上运行。我们正在使用 C++。我们是带有 recvfrom 的非阻塞套接字。在“read”函数中检查的第一件事是调用后recvfrom“in”缓冲区是否包含NULL,然后错误是WSAEWOULDBLOCK。
如果发现错误,函数返回,线程休眠 1ms(但实际上更长)。
如果有数据,则对其进行处理。一些路径导致立即处理,但大多数情况下,数据被放入队列中供游戏区域的主线程处理。
我的问题:有没有比使用 thread.sleep(1) 更有效和执行的方法来确保每个游戏区域的 UDP 服务器实例在没有接收任何内容时不会旋转,并且能够比固有的和更快地响应数据包调度器的随机线程唤醒?
在要求的最后一部分中,我指的是一个线程通常永远不会只休眠 1ms,而是平均更像 50ms。
这种情况可能会出现,稍后当服务器以恒定速率发送请求时,检查和响应数据包的循环永远不会为空,因此永远不会到达 thread.sleep(1),所以我想这是更多是最佳实践类型的问题,但如果有可用的解决方案,我会实施更好的解决方案。
谢谢
编辑 - 添加信息。添加这个之后,也许这个实现就没什么好担心的了。我认为最坏的情况是一组数据包必须等待 45-55 毫秒才能安排线程,如果他们错过了被套接字读取的机会。我想改进一下,我可以让 recvfrom 调用它自己的线程,使套接字阻塞,并使用条件变量来唤醒负责处理数据包的线程。你怎么看这个想法?开销太大?