Linux 线程,在主线程中睡眠



我的程序有很多线程,主循环没有函数。我曾经将主循环编码为 while(1){sleep(1);}。

我现在问自己,但不确定在性能方面,空的主循环(while(1){})是否比睡眠(1)更好,反之亦然,或者相同???

我认为调度程序会检查每个调度周期中的每个任务,看看它们是否需要被唤醒,这确实是:

  • 当 main 为空时循环:唤醒时不执行任何操作

  • 当 main 是睡眠循环时:检查/重新计算唤醒时间戳,如果需要唤醒,则唤醒什么都不做

有什么不同吗?

有很大的

区别。sleep(1) 版本比 empty 而 while(1){} 要好得多。

sleep(1)让系统内核检查时间,当时间报警到达时,下一步运行。所以它只花费一点资源。

但是 while(1)

{} 不同,它会一直运行语句 "while(1)",它会花费大量的 CPU 资源(它能得到的所有资源)。

您可以使用top命令来检查资源使用情况,您会发现 sleep(1) 版本只使用少量资源,而 "while(1){}" 使用 100% CPU(CPU 核心/线程)

当您使用线程时,最好的选择可能是在主线程中没有循环,而是在等待其他线程完成的join操作中循环。

我对空的while循环是错误的,如peter__barnes所述,它会消耗所有剩余的CPU。我真正的程序在main():while(someCondition){//empty loop}中有这个。someCondition()有一些信号在里面等待。我只是想将main()中的空循环与main()中的while(1){sleep(1);}的其他程序进行比较。但这不是一个空循环。所以我的问题错了,但无论如何,它向我打开了以前不知道的事情,以及后续的问题:

如果我的程序是一个永远不会退出的守护进程,main() 中的 pause() 或 join() 更好吗?

最新更新