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

时间:2017-07-25 14:32:23

标签: c++ client-server winsock2

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

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

我想知道,如果在循环的第二部分中使用超时{0,0}调用{{1}}是不好的做法吗?我发现this website说:

  

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

我真的不明白,为什么我应该避免使用它。如果有人能解释,我会很感激。

1 个答案:

答案 0 :(得分:1)

  

我真的不明白,为什么我应该避免[调用带有零超时的select())。如果有人   可以解释一下,我很感激。

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

更好的方法是计算何时需要select()唤醒(例如,从现在开始到下次需要绘制帧的时间,或者执行其他计划任务),然后传入选择超时参数的时间量。这将导致select()阻塞(最多达到你指定的时间),因此允许你的线程在它不需要做任何事情的时候睡觉。这将使一个总是使用所有(至少)一个整个CPU核心的程序与仅使用它实际完成任务所需的最少CPU时间的程序之间的区别。