为啥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这样的非阻塞睡眠功能的主要内容,如果未能解决你的问题,请参考以下文章
为啥c#中bool要占4个字节 32位呢 为啥不用像byte 1个字节存储呢