一个普通的工作线程在一个循环中运行,在这个循环中它检查队列中的可用任务并使用它们。我似乎有一些示例,其中线程在没有可用任务时等待几毫秒,std::this_thread::sleep_for()
例如使用。但是,我希望我的线程以最小的延迟消耗任务,所以我不使用睡眠。这有什么不好吗?检查任务时,工作线程是否应该休眠几毫秒?
1 回答
如果您“滚动自己的”队列或消息系统,避免消耗 100% cpu 的一种方法是在没有可用工作时“休眠”一会儿。但是,拥有一些其他机制让操作系统为您处理这个问题(信号量、基于操作系统的队列,如管道或邮箱系统,甚至使用网络消息传递机制等)会好得多,因为它简化了您的应用程序,并允许操作系统处理睡眠/唤醒处理。
当然,这完全取决于您实际尝试实现的目标以及期望是什么——如果您的代码打算在手机上运行,那么不浪费 CPU 周期至关重要,因为这也会缩短电池寿命因为浪费了可以用于其他任务的 CPU 周期。另一方面,如果您的消息系统位于汽车的 ABS 制动器中,并且您需要以亚微秒的精度测量来自传感器的脉冲时间,那么休眠将不是一个好主意,因为您的代码可能会休眠ABS 传感器发出的脉冲超过一次。
如果它在桌面上,没有人会关心你的应用程序在运行几秒钟甚至一分钟或更长时间时是否不休眠。但是,如果它以 100% 的速度持续使用 1 个核心数小时(并且您的应用程序没有产生至少与浪费的循环一样有价值的东西 - 显然计算世界上第二大素数或折叠蛋白质值得浪费循环. 节省 0.5 毫秒从互联网接收数据包可能不是)。
只有您(当然还有参与该项目的任何其他人)会知道您的项目的设计标准是什么。这不是您可以“询问互联网”的事情。然而,一旦你弄清楚你的设计标准是什么,上面应该会给你一些指导。