c++ - 这里真的需要 sleep() 吗?

标签 c++ c multithreading operating-system sleep

由于某些语言不提供互斥锁,因此需要自己构建它。我通常会写这样的代码:(伪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 中断、等)已收到。

操作系统提供的同步原语的工作原理类似。例如,请求锁定互斥锁会导致系统调用将线程置于休眠状态,直到互斥锁解锁为止;操作系统知道互斥体已解锁,因为解锁也必须通过系统调用。

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

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

关于c++ - 这里真的需要 sleep() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443646/

相关文章:

c++ - 这个给定数据结构的时间复杂度

C++ vector push_back()

objective-c - 在 C 和 Objective-C 中,我们应该使用 0.5f 还是 0.5?

java - 与 HikariCP 的并发

python - 为什么使用全局解释器锁?

c++ - C++11 中的异步 IO

c++ - 如何定义指向整数的指针的别名?

c++ - 在重载决议期间如何处理隐含的对象参数?

c - 二维数组 - 为什么我没有引用预期的元素?

c# - 使用 "greater than or equals"或仅使用 "greater than"