2011-10-05 75 views
0

我有一个(软)实时系统查询一些传感器数据,做一些处理,然后等待下一组传感器数据。传感器数据在接收器线程中读取并放入队列中,因此主线程正在“睡眠”(通过互斥锁),直到新数据到达。实现低优先级后台线程的模式?

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

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

根据Setting thread priority in Linux with Boost,有人怀疑设置线程优先级会完成这项工作。我想知道如何衡量哪些效果设置线程优先级真的具有? (平台:Angstrom Linux,ARM PC)

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

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

感谢您的想法!

+0

为什么不只是创建接收者线程和主线程具有很高的优先级?当传感器线程设置准备好驱动程序,它将运行使用全部CPU的,当它设置互斥锁的主线程将与所有的CPU的运行,(当然一旦传感器螺纹回来等待它的驱动程序) 。如果做不到这一点,你可以将部分/全部传感器数据处理到传感器的驱动程序? –

回答

4

你的问题是OS调度器,而不是C++。您需要有一个实时调度程序,用于在较高优先级的线程运行时阻塞较低优先级的线程。

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

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

0

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

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

+0

我应该将这个答案发布到链接的问题中...... – knulp