【发布时间】:2020-10-27 05:15:00
【问题描述】:
sleep() 在给定 x 秒数的情况下阻塞 C 中正在运行的线程。
如果我没记错的话,这可以通过两种方式实现。要么进入无限循环,然后用 BIOS 检查当前时间,如果 time>=timeout 则结束循环。
第二种方法是在CPU中使用定时器,让定时器异步计数,不阻塞CPU线程。
我对上述两种方法是否正确?如果是这样,为什么 C 没有植入第二种方式的功能,这样我们就可以有非阻塞的“延迟”?
【问题讨论】:
-
因为C语言没有原生的异步计算支持,所以只能使用pthread之类的库。
-
但从理论上讲,
sleep可以有一个async版本,对吗?没有什么能阻止硬件这样做。 -
取决于硬件。 C 旨在用于编程几乎任何东西,从上一代游戏到比一粒米还小的 8 针微控制器,因此该语言不依赖于将其限制为高级硬件的功能。
-
这个问题似乎混淆了两件事:
sleep()阻塞了 程序(或线程)但希望不会阻塞 CPU (以便其他线程或进程可以运行),以及异步计时器(如非 ISOalarm()),让程序继续运行并在一定时间后通知它。操作系统完全有可能在没有繁忙循环的情况下以“第二种方式”实现sleep,方法是切换到另一个进程(或停止 CPU)并让计时器中断在超时到期时导致切换回来。跨度> -
因为这需要线程或事件循环。