POSIX 中的正确消息队列用法
Proper message queue usage in POSIX
我对在实时操作系统中使用消息队列感到非常困惑。给出的代码似乎将消息队列使用到骨头:甚至将变量传递给另一个类对象也是通过 MQ 完成的。我一直有一个在IPC中使用的MQ的概念。问题是:什么是消息队列的正确用法?
在实时操作系统环境中,您经常面临必须保证以固定计划执行代码的问题。 例如,您可能有一个每 10 毫秒精确调用一次的函数。不早,不晚。
为了保证这种硬时序约束,您必须编写在任何情况下都不得阻塞时间关键代码的代码。
此处不能使用 posix 线程同步原语。切勿从时间关键代码锁定互斥锁或限制信号量,因为其他进程/线程可能已经锁定了它。但是,通常允许您从时间关键代码中取消阻止其他线程(例如,发布信号量是可以的)。
在这样的环境中,消息队列是交换数据的不错选择,因为它们提供了一种干净的方式来将数据从一个线程传递到另一个线程而不会阻塞。
使用队列来设置变量可能听起来有点矫枉过正,但它是非常好的软件设计。如果你这样做,你就有一个定义良好的接口来访问你的时间关键型代码。
此外,它有助于编写确定性代码,因为您永远不会遇到竞争条件的问题。如果通过消息队列设置变量,则可以确保时间关键型代码以与发送消息相同的顺序看到消息。混合使用直接内存访问和消息时,无法保证这一点。
消息队列主要用作 IPC 机制,每当需要在两个不同的进程之间交换数据时。但是,有时消息队列也用于线程上下文切换。例如:
您使用位于驱动程序顶部的软件层注册一些回调。回调将在驱动程序的上下文中返回给你。它是驱动程序生成的线程。现在你不能通过在其中进行大量处理来占用这个驱动程序线程。因此,可以将回调中返回的数据添加到消息队列中,该队列阻止了应用程序线程以对数据执行处理。
我不明白为什么应该使用消息队列来替换普通的函数调用。
- boost::进程间消息队列引发错误
- 避免使用 boost::进程间::消息队列创建文件
- 提升消息队列 跨两个进程未接收
- 可以将Boost消息队列文件重定向到用户指定的位置
- 使用加速进程间创建消息队列 - 内存访问冲突
- 如何检查提升消息队列是否存在
- Win32 消息队列在使用 OpenGL 渲染时被淹没
- 在尝试使用boost时断言.跨很多过程中的互动消息队列
- GetMessage/PeekMessage - 删除消息队列中的所有消息
- IPC Unix 消息队列线程安全吗?
- 在.c文件接收函数中使用Linux中的MSGGET创建消息队列未实现错误
- boost消息队列线程安全和进程安全吗?
- 为什么我的无锁消息队列段错误:(?
- 在控制台应用程序中处理空的windows消息队列
- 关于在这种情况下消息队列与共享内存的适用性或适用性
- boost::进程间消息队列创建时的竞争条件
- 从内存转储中查找线程消息队列中的消息
- win32消息泵,do dispatchMessage()处理整个消息队列或仅仅是顶部消息
- 如何使用Boost进程间消息队列for Windows
- 来自另一个线程的 SendMessage() 调用是否将消息发布到消息队列