我正在使用select
库创建基于客户端 - 服务器模型的多人实时游戏。对于通信部分,我决定使用非阻塞套接字,而不是阻塞套接字以消除多线程。
在客户端,我想在一个循环中处理这些任务:
我想知道,如果在循环的第二部分中使用超时{0,0}调用{{1}}是不好的做法吗?我发现this website说:
超时值{0,0}表示select()将立即返回,允许应用程序在select()操作上进行轮询。 出于性能原因,应该避免这种情况。
我真的不明白,为什么我应该避免使用它。如果有人能解释,我会很感激。
答案 0 :(得分:1)
我真的不明白,为什么我应该避免[调用带有零超时的select())。如果有人 可以解释一下,我很感激。
如果您的线程的事件循环从不阻止任何地方,那么您将以100%的CPU使用率旋转CPU。这是低效的,因为您将浪费数万亿的CPU周期,以最大速度无意义地旋转事件循环,而实际上没有做任何工作,因此所有这些CPU周期将无法在其他地方使用(例如,通过其他程序或你自己的程序中的其他线程)。这也会产生过多的热量,并且(在笔记本电脑或其他便携式设备上)会很快耗尽电池。
更好的方法是计算何时需要select()唤醒(例如,从现在开始到下次需要绘制帧的时间,或者执行其他计划任务),然后传入选择超时参数的时间量。这将导致select()
阻塞(最多达到你指定的时间),因此允许你的线程在它不需要做任何事情的时候睡觉。这将使一个总是使用所有(至少)一个整个CPU核心的程序与仅使用它实际完成任务所需的最少CPU时间的程序之间的区别。