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

Posted

技术标签:

【中文标题】实现低优先级后台线程的模式?【英文标题】:Pattern for realizing low priority background threads? 【发布时间】:2011-10-05 04:08:50 【问题描述】:

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

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

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

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

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

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

感谢您的意见!

【问题讨论】:

为什么不直接创建具有很高优先级的接收线程和主线程呢?当驱动程序设置传感器线程就绪时,它将使用所有 CPU 运行,当它设置互斥锁时,主线程将使用所有 CPU 运行,(一旦传感器线程返回等待其驱动程序) .如果做不到这一点,您能否将部分/全部传感器数据处理移至传感器驱动程序? 【参考方案1】:

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

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

在许多系统中,您必须生成一个任务(使用fork)以确保漂亮的关卡和 RT 调度程序实际上是有效的,您必须阅读您的手册系统并找出您拥有哪些调度模块以及它们是如何实现的。

【讨论】:

【参考方案2】:

在 Boost::Thread 中设置优先级没有可移植的方法。原因是不同的操作系统会有不同的 API 来设置优先级(例如 Windows 和 Linux)。

以可移植方式设置优先级的最佳方法是使用统一的 API 为 boost::thread 编写一个包装器,该 API 在内部获取线程 native_handle,然后使用操作系统特定的 API(例如,在 Linux 中,您可以使用 sched_setscheduler())。 你可以在这里看到一个例子: https://sourceforge.net/projects/threadutility/ (我一个学生做的代码,看svn仓库)

【讨论】:

以上是关于实现低优先级后台线程的模式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pthreads 时的后台线程(很好,优先级)

如何指定线程优先级?

带 pthread 的后台线程

并发编程线程基础知识:守护线程

并发编程线程基础知识:守护线程

并发编程线程基础知识:守护线程