工作线程是否需要睡眠

Does a worker thread need to sleep?

本文关键字:线程 是否 工作      更新时间:2023-10-16

一个普通的工作线程在一个循环中运行,在这个循环中它检查队列中的可用任务并消耗它们。我看到了一些例子,当没有可用任务时,线程会等待几毫秒,例如使用std::this_thread::sleep_for()。然而,我希望我的线程以最小的延迟消耗任务,所以我不使用睡眠。这有什么不好吗?工作线程在检查任务时是否应该睡眠几毫秒?

如果您"滚动自己的"队列或消息系统,避免消耗100%cpu的一种方法是在没有可用工作时"睡眠"一段时间。然而,有一些其他机制让操作系统为您处理这件事(信号量、基于操作系统的队列,如管道或邮箱系统,甚至使用网络消息传递机制等)会更好,因为它简化了您的应用程序,并允许操作系统处理睡眠/唤醒处理。

当然,这完全取决于你实际想要实现的目标和期望值——如果你的代码打算在手机上运行,那么不浪费CPU周期是至关重要的,因为这会缩短电池寿命,也会浪费可用于其他任务的CPU周期。另一方面,如果您的信息系统位于汽车的ABS制动器中,并且您需要以亚微秒的精度测量来自传感器的脉冲时间,那么睡眠将是一个坏主意,因为您的代码可能会比来自ABS传感器的一次脉冲睡得更长。

如果它在桌面上,如果你的应用程序运行了几秒钟甚至一分钟或更长时间,没有人会关心它是否没有睡眠。但是,如果它在几个小时内一直以100%的速度使用1个核心(而你的应用程序并没有产生至少与浪费的周期一样有价值的东西——显然,计算世界上第二大素数或折叠蛋白质值得浪费周期。从互联网上接收数据包可能不需要节省0.5毫秒)。

只有你(当然还有其他参与项目的人)才能知道你的项目的设计标准是什么。这不是什么你可以"问互联网"的事情。然而,一旦你弄清楚了你的设计标准是什么,以上应该会给你一些指导。