为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能

Posted

技术标签:

【中文标题】为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能【英文标题】:Why doesn't C have a non blocking sleep function like setTimeout in javascript为什么C没有像javascript中的setTimeout这样的非阻塞睡眠功能 【发布时间】:2020-10-27 05:15:00 【问题描述】:

sleep() 在给定 x 秒数的情况下阻塞 C 中正在运行的线程。 如果我没记错的话,这可以通过两种方式实现。要么进入无限循环,然后用 Bios 检查当前时间,如果 time>=timeout 则结束循环。

第二种方法是在CPU中使用定时器,让定时器异步计数,不阻塞CPU线程。

我对上述两种方法是否正确?如果是这样,为什么 C 没有植入第二种方式的功能,这样我们就可以有非阻塞的“延迟”?

【问题讨论】:

因为C语言没有原生的异步计算支持,所以只能使用pthread之类的库。 但从理论上讲,sleep 可以有一个 async 版本,对吗?没有什么能阻止硬件这样做。 取决于硬件。 C 旨在用于编程几乎任何东西,从上一代游戏到比一粒米还小的 8 针微控制器,因此该语言不依赖于将其限制为高级硬件的功能。 这个问题似乎混淆了两件事:sleep() 阻塞了 程序(或线程)但希望不会阻塞 CPU (以便其他线程或进程可以运行),以及异步计时器(如非 ISO alarm()),让程序继续运行并在一定时间后通知它。操作系统完全有可能在没有繁忙循环的情况下以“第二种方式”实现sleep,方法是切换到另一个进程(或停止 CPU)并让计时器中断在超时到期时导致切换回来。跨度> 因为这需要线程或事件循环。 【参考方案1】:

还有另一种方法,通常是在调用sleep() 之后:告诉内核调度程序从可运行集中删除这个进程,直到时间到期。

对于设置计时器并告诉您何时完成的功能,您可以从查看alarm() 和pause() 开始。这些不在标准 C 库中,但它们在 Posix 中已经存在很长时间了。

在 Windows 上,您可以查看 SetTimer。

【讨论】:

以上是关于为啥C没有像javascript中的setTimeout这样的非阻塞睡眠功能的主要内容,如果未能解决你的问题,请参考以下文章

为啥 /*@ 不是 JavaScript 中的注释?

为啥c#中bool要占4个字节 32位呢 为啥不用像byte 1个字节存储呢

date.setTime (Date) – JavaScript 中文开发手册

mfc里SetTimer和Sleep有啥区别

为啥 JavaScript 中的对象不可迭代?

为啥 NaN 大于 JavaScript 中的任何数字? [复制]