工作线程是否需要睡眠
Does a worker thread need to sleep?
一个普通的工作线程在一个循环中运行,在这个循环中它检查队列中的可用任务并消耗它们。我看到了一些例子,当没有可用任务时,线程会等待几毫秒,例如使用std::this_thread::sleep_for()
。然而,我希望我的线程以最小的延迟消耗任务,所以我不使用睡眠。这有什么不好吗?工作线程在检查任务时是否应该睡眠几毫秒?
如果您"滚动自己的"队列或消息系统,避免消耗100%cpu的一种方法是在没有可用工作时"睡眠"一段时间。然而,有一些其他机制让操作系统为您处理这件事(信号量、基于操作系统的队列,如管道或邮箱系统,甚至使用网络消息传递机制等)会更好,因为它简化了您的应用程序,并允许操作系统处理睡眠/唤醒处理。
当然,这完全取决于你实际想要实现的目标和期望值——如果你的代码打算在手机上运行,那么不浪费CPU周期是至关重要的,因为这会缩短电池寿命,也会浪费可用于其他任务的CPU周期。另一方面,如果您的信息系统位于汽车的ABS制动器中,并且您需要以亚微秒的精度测量来自传感器的脉冲时间,那么睡眠将是一个坏主意,因为您的代码可能会比来自ABS传感器的一次脉冲睡得更长。
如果它在桌面上,如果你的应用程序运行了几秒钟甚至一分钟或更长时间,没有人会关心它是否没有睡眠。但是,如果它在几个小时内一直以100%的速度使用1个核心(而你的应用程序并没有产生至少与浪费的周期一样有价值的东西——显然,计算世界上第二大素数或折叠蛋白质值得浪费周期。从互联网上接收数据包可能不需要节省0.5毫秒)。
只有你(当然还有其他参与项目的人)才能知道你的项目的设计标准是什么。这不是什么你可以"问互联网"的事情。然而,一旦你弄清楚了你的设计标准是什么,以上应该会给你一些指导。
- 如何检查线程是否锁定
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 检查分离的线程是否还活着?
- 将正常函数的工作分配给多个线程是否安全
- 最大线程数 - 如何确定C++线程是否并行运行?
- 如何确定其他线程是否正在运行?
- 线程是否真的在调用 std::future::get() 后启动
- 如何知道分离的STD ::线程是否完成了执行
- 通知线程是否始终需要在修改期间锁定共享数据
- 只写到共享 std::unordered_map 线程是否安全
- 检查线程是否在 c++11 中完成
- C++ 互斥 - 检查另一个线程是否正在等待
- 提升::作用域的线程是否自动分离
- 以下单例实现线程是否安全?
- 确定线程是否已退出
- 我的不同线程是否会看到更新后的shared_ptr对象
- 使用操作当前对象的线程是否安全
- 此同步对象实现线程是否安全
- 线程是否共享一些类字段