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

时间:2011-10-05 04:08:50

标签: c++ multithreading design-patterns

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

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

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

根据Setting thread priority in Linux with Boost,设置线程优先级是有用的。我想知道如何衡量哪个效果设置线程优先级真的有效? (平台:Angstrom Linux,ARM PC)

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

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

感谢您的想法!

2 个答案:

答案 0 :(得分:4)

你的问题是OS调度程序,而不是C ++。您需要有一个真正的实时调度程序,它将在优先级较高的线程运行时阻止优先级较低的线程。

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

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

答案 1 :(得分:0)

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

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