c++ - 实现低优先级后台线程的模式?

标签 c++ multithreading design-patterns

我有一个(软)实时系统,它查询一些传感器数据,进行一些处理,然后等待下一组传感器数据。传感器数据在接收器线程中读取并放入队列中,因此主线程处于“休眠”状态(通过互斥),直到新数据到达。

后台还有其他任务,如日志记录或一些长期计算。这些被实现为在其他线程中运行。

然而,重要的是,当主线程处理传感器数据时,它应该具有最高优先级,这意味着如果可能的话,其他线程不应该消耗任何 CPU 资源(目前后台线程导致主线程变慢以一种 Not Acceptable 方式下降。)

根据 Setting thread priority in Linux with Boost怀疑设置线程优先级是否可以完成这项工作。我想知道如何衡量设置线程优先级的真正效果? (平台:Angstrom Linux、ARM PC)

有没有办法完全“暂停”和“继续”线程?

C++ 中是否有一种模式可以让我自己实现暂停/继续? (我可能能够将后台工作分成小块,如果允许我继续,我可以在每个工作 block 之后检查,但问题是这些 block 应该有多大等。)

谢谢你的想法!

最佳答案

您的问题出在操作系统调度程序上,而不是 C++。您需要有一个真正的实时调度程序,它会在较高优先级线程运行时阻塞较低优先级线程。

大多数“标准”PC 调度程序都不是实时的。有一个适用于 Linux 的 RT 调度程序 - 使用它。从阅读 SCHED_RR 和 SCHED_FIFO 以及 nice 命令开始。

在许多系统中,您必须生成一个任务(使用fork)以确保nice levels 和RT 调度器实际有效,您必须阅读通过你的系统手册,找出你有哪些调度模块以及它们是如何实现的。

关于c++ - 实现低优先级后台线程的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7656633/

相关文章:

c++ - 你如何为 x64 编译静态 pthread-win32 库?

multithreading - node.js模块: Async vs Fibers. Promise与Q_oper8

java - 从并发修改异常中恢复

java - 难道真的是拒绝 parent 遗赠代码的味道吗?

java - 这个单例对序列化和反射攻击都有抵抗力吗?

c++ - 从一种类型转换为另一种类型时的模板类型推导

c++ - 当检查是eof时,使用getline读取文本文件会导致无限循环

c++ - 在模板类型推导之前评估 noexcept 说明符

android - 如何使用循环器创建后台线程

java - 对 java.util.Date 中的 getTime 和 getTimeImpl 方法感到困惑?