这里真的需要睡眠吗

Is sleep() really needed here?

本文关键字:真的 这里      更新时间:2023-10-16

由于某些语言不提供互斥锁,因此需要自己构建它。我通常会写这样的代码:(伪C++,只是为了让你知道我的意思。我不确定我的写作是否正确,因为我已经好几年没有写C++代码了)

oldval = 0;
newval = 1;
//suggest there was a Compare And Set operation that make only one thread return true,if no CAS operation , call any other language module that can offer a cas instead
while (!CAS(*somepointer,oldval,newval)) {
     //lock failed
     sleep(1000); //sleep one second or some value really depend on what you are doing.
}
//lock succeed, do something....
*somepointer = oldval; //release lock.

显然,sleep会降低处理速度,但我曾经担心,如果sleep被丢弃。。。线程切换不是太频繁而降低性能吗?现在我深入思考,sleep是如何实现的?如果他们这样做。。。

expired = getCurrentTime() + sleepTime;
while (getCurrentTime() < expired) { }

这只会让事情变得更糟。

现在,我认为只有当我真的需要暂停线程一段时间时,才应该使用sleep,所以也许我的情况是错误的。

sleep()和相关函数对操作系统进行系统调用,请求操作系统在设定的时间内唤醒进程。在某些情况下(例如,接收到信号/异常),操作系统可能会更快地唤醒进程,但进程在等待期间的CPU使用率为零。

如果操作系统发现所有进程都在休眠(或在某种超时时被阻止),它可以通过使用特定于硬件的指令来休眠处理器,直到接收到中断(例如时钟中断、DMA中断等),从而进入休眠状态。

操作系统提供的同步原语的工作方式类似。例如,请求锁定互斥体会导致系统调用,使线程进入睡眠状态,直到互斥体解锁;OS知道互斥锁被解锁,因为解锁还必须经过系统调用。

与简单的繁忙等待循环相比,使用sleep使用的CPU要少得多。然而,您的操作系统可能至少提供一些同步原语(即使是嵌入式系统,如果它们以任何方式支持线程,也会经常提供这些原语),例如信号量或锁。在尝试推出自己的操作系统之前,你应该先弄清楚你的操作系统是否提供了这些功能;如果您使用操作系统提供的同步原语,您的应用程序将具有更好的性能和响应能力。

重要提示:如果您在裸金属嵌入式平台上进行开发,库sleep实际上可能是一个繁忙的等待(就像在Arduino上一样),因为没有操作系统调度程序可以让线程进入睡眠状态。在这种情况下,如果最大限度地减少处理器使用量很重要(例如,为了降低功耗),那么如果您的库没有提供,则需要找到一种特定于处理器的方法来暂停CPU。