繁体   English   中英

Winsock2 select()函数:传递{0,0}作为超时参数

[英]Winsock2 select() function: passing {0, 0} as timeout parameter

我正在使用<winsock2.h>库基于客户端-服务器模型创建多人实时游戏。 对于通信部分,我决定使用非阻塞套接字,而不是阻塞套接字以消除多线程。 在客户端,我想在一个循环中处理这些任务:

  • 处理用户输入(如有必要)
  • 向服务器发送数据/从服务器接收数据(如果可能)
  • 更新游戏数据(频率恒定)
  • 刷新屏幕(频率恒定)

我想知道,在循环的第二部分中调用带有超时{0,0}的select是一种不好的做法吗? 我发现这个网站说:

超时值{0,0}表示select()将立即返回,从而允许应用程序轮询select()操作。 出于性能原因,应避免这种情况。

我不太了解,为什么我应该避免使用它。 如果有人可以解释,我将不胜感激。

我不太明白,为什么我应该避免[以零超时调用select())。 如果有人可以解释,我将不胜感激。

如果线程的事件循环从未在任何地方阻塞那么您将以100%的CPU使用率旋转CPU。 这是低效的,因为您将浪费数万亿个CPU周期,而实际上却没有做任何工作而以最大速度毫无意义地围绕事件循环旋转,因此所有这些CPU周期将无法在其他地方使用(例如,由其他程序或其他线程使用)在您自己的程序中)。 这也会产生过多的热量,并且(在笔记本电脑或其他便携式设备上)会很快耗尽电池电量。

更好的方法是计算何时需要select()唤醒(例如,从现在到下一次之间还剩下多少时间,您需要绘制框架或执行其他计划的任务),然后传递该数量的选择超时的时间。 这将导致select()阻塞(最多达到您指定的时间),因此在不需要执行任何操作的期间允许线程进入睡眠状态。 这将使始终使用全部(至少)一个完整的CPU内核的程序与仅使用其完成任务实际需要的最少CPU时间的程序有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM