实现低优先级后台线程的模式
Pattern for realizing low priority background threads?
我有一个(软)实时系统,它查询一些传感器数据,做一些处理,然后等待下一组传感器数据。传感器数据在接收线程中读取并放入队列,因此主线程处于"睡眠"状态(通过互斥锁),直到新数据到达。
还有其他任务,如日志记录或后台的一些长期计算。这些实现是为了在其他线程中运行。
然而,重要的是,当主线程处理传感器数据时,它应该具有最高优先级,这意味着如果可能的话,其他线程不应该消耗任何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存储库)
- Visual Studio 发布模式阻止在调试模式下执行的代码.使用 WinHTTP 和多线程
- 多线程程序卡在优化模式下,但在 -O0 中正常运行
- C++中的线程 交错模式
- 如何在另一个线程中关闭 MFC 模式对话框并获取对话框返回值?
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 工作线程队列的这种变体是某种模式或通用结构吗?
- COCOS2D-X:从另一个线程中加载精灵,任何模式
- 在用户模式下从另一个进程回调,没有额外的线程
- 这是否可以兑换线程安全的双重检查锁定模式
- C++Win32 在低优先级模式下运行应用程序/线程
- 线程退出时 DLL 中的 MFC 无模式对话框被销毁
- 线程池的设计模式
- 多线程模式下的SQLite3:执行到底不安全
- 在多个相互依赖的线程上进行封送处理和等待的算法、模式或最佳实践
- 避免忙于等待,并在实时和非实时线程之间切换模式
- 考虑 CPU 提升模式的多线程超线性性能实现
- 用户模式计划程序线程的最大数量
- Qt串行端口的C++线程模式
- 在多线程代码中缓存友好的数组迭代模式
- 释放模式下的boost线程崩溃