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

Pattern for realizing low priority background threads?

本文关键字:模式 线程 后台 优先级 实现      更新时间:2023-10-16

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

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

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

根据在Linux中使用Boost设置线程优先级,设置线程优先级是否能完成任务是有疑问的。我想知道我如何衡量设置线程优先级的效果?(平台:Angstrom Linux, ARM PC)

是否有一种方法来"暂停"answers"继续"线程完全?

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

谢谢你的想法!

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

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

在许多系统中,你必须生成一个任务(使用fork)来确保良好的级别和RT调度程序实际上是有效的,你必须通读系统的手册,找出你有哪些调度模块以及它们是如何实现的。

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

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