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