Winsock2 select() 函数:传递 {0, 0} 作为超时参数
Winsock2 select() function: passing {0, 0} as timeout parameter
我正在使用 <winsock2.h>
库创建基于客户端-服务器模型的多人实时游戏。对于通信部分,我决定使用非阻塞套接字,而不是阻塞套接字来消除多线程。
在客户端,我想在一个循环中处理这些任务:
- 处理用户输入(如有必要)
- Sending/receiving数据to/from服务器(如果可能的话)
- 更新游戏数据(固定频率)
- 正在刷新屏幕(以恒定频率)
我想知道,在循环的第二部分用超时 {0, 0} 调用 select
是否是一种不好的做法?我发现 this website 上面写着:
The timeout value {0, 0} indicates select() will return immediately, allowing an application to poll on the select() operation. This should be avoided for performance reasons.
我不太明白,为什么我应该避免使用它。如果有人能解释一下,我将不胜感激。
I don't really understand, why I should avoid [calling select() with a zero-timeout). If someone
could explain, I would appreciate it.
如果您的线程的事件循环从不阻塞任何地方,那么您将以 100% CPU 使用率旋转 CPU。这是低效的,因为你将浪费数万亿 CPU 周期,以最大速度毫无意义地围绕你的事件循环旋转,而实际上没有做任何工作,因此所有这些 CPU 周期将无法在其他地方使用(例如,通过其他程序或您自己程序中的其他线程)。这也会产生过多的热量,并且(在笔记本电脑或其他便携式设备上)会很快耗尽电池电量。
更好的方法是计算何时需要 select() 唤醒(例如,从现在到下次需要绘制框架或执行其他计划任务之间还剩多少时间),然后将该时间量传递给 select 的超时参数。这将导致 select()
阻塞(最多达到您指定的时间),因此允许您的线程在不需要做任何事情的期间休眠。这将在始终使用所有(至少)一个完整 CPU 核心的程序和仅使用完成其任务实际需要的最少量 CPU 时间的程序之间产生差异。
我正在使用 <winsock2.h>
库创建基于客户端-服务器模型的多人实时游戏。对于通信部分,我决定使用非阻塞套接字,而不是阻塞套接字来消除多线程。
在客户端,我想在一个循环中处理这些任务:
- 处理用户输入(如有必要)
- Sending/receiving数据to/from服务器(如果可能的话)
- 更新游戏数据(固定频率)
- 正在刷新屏幕(以恒定频率)
我想知道,在循环的第二部分用超时 {0, 0} 调用 select
是否是一种不好的做法?我发现 this website 上面写着:
The timeout value {0, 0} indicates select() will return immediately, allowing an application to poll on the select() operation. This should be avoided for performance reasons.
我不太明白,为什么我应该避免使用它。如果有人能解释一下,我将不胜感激。
I don't really understand, why I should avoid [calling select() with a zero-timeout). If someone could explain, I would appreciate it.
如果您的线程的事件循环从不阻塞任何地方,那么您将以 100% CPU 使用率旋转 CPU。这是低效的,因为你将浪费数万亿 CPU 周期,以最大速度毫无意义地围绕你的事件循环旋转,而实际上没有做任何工作,因此所有这些 CPU 周期将无法在其他地方使用(例如,通过其他程序或您自己程序中的其他线程)。这也会产生过多的热量,并且(在笔记本电脑或其他便携式设备上)会很快耗尽电池电量。
更好的方法是计算何时需要 select() 唤醒(例如,从现在到下次需要绘制框架或执行其他计划任务之间还剩多少时间),然后将该时间量传递给 select 的超时参数。这将导致 select()
阻塞(最多达到您指定的时间),因此允许您的线程在不需要做任何事情的期间休眠。这将在始终使用所有(至少)一个完整 CPU 核心的程序和仅使用完成其任务实际需要的最少量 CPU 时间的程序之间产生差异。