c++ - while 循环是否总是占用全部 CPU 资源?

标签 c++ c timer operating-system

我需要创建一个服务器端游戏循环,问题是如何限制循环 cpu 使用。

根据我的编程经验,繁忙的循环总是尽可能地占用最大的 CPU 使用率。但是我正在阅读SDL(Simple DirectMedia Layer)的代码,它有一个函数SDL_Delay(UINT32 ms),它有一个while循环,它是否占用最大cpu使用率,如果不是,为什么?

https://github.com/eddieringle/SDL/blob/master/src/timer/unix/SDL_systimer.c#L137-158

do {
    errno = 0;

#if HAVE_NANOSLEEP
    tv.tv_sec = elapsed.tv_sec;
    tv.tv_nsec = elapsed.tv_nsec;
    was_error = nanosleep(&tv, &elapsed);
#else
    /* Calculate the time interval left (in case of interrupt) */
    now = SDL_GetTicks();
    elapsed = (now - then);
    then = now;
    if (elapsed >= ms) {
        break;
    }
    ms -= elapsed;
    tv.tv_sec = ms / 1000;
    tv.tv_usec = (ms % 1000) * 1000;

    was_error = select(0, NULL, NULL, NULL, &tv);
#endif /* HAVE_NANOSLEEP */
} while (was_error && (errno == EINTR));

最佳答案

此代码使用 select 超时。 select 通常接受一个文件描述符,并让调用者等待直到 fd 上发生 IO 事件。它还需要一个超时参数来表示等待的最长时间。这里fd为0,所以不会发生任何事件,函数会一直在超时时返回。

您从 C 库中获得的 select(3)select(2) 系统调用的包装器,这意味着调用 select(3 ) 最终让你进入内核。然后内核不会调度进程,除非发生 IO 事件或达到超时。因此进程在等待时不使用 CPU。

显然,跳入内核和进程调度会引入延迟。因此,如果您必须有非常低的延迟(纳秒),您应该使用忙等待。

关于c++ - while 循环是否总是占用全部 CPU 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692405/

相关文章:

c - 如何获取行数导致 SQL (C ANSI) 中的查询?

javascript - 计数计时器启动滞后

java - 主方法完成后的 Swing 计时器持久性

c++ - emplace 中的危险隐式转换

c++ - 为什么 mpd_connection_clear_error () 在 mpd_recv_idle () 的 MPD_ERROR_TIMEOUT 之后失败?

c++ - 从知道其结构类型的实例中获取值

c - 线程程序中的段错误

c - 在外部设备上使用 gethostbyname() 函数

c++ - 在 Visual Studio 的 C++ 项目中是否可以使用宏来识别当前的 SOLUTION 配置?

wpf - 由于 “direct delegate roots”,System.Timers.Timer泄漏