POSIX中正确的消息队列使用

时间:2011-05-13 03:33:15

标签: c++ posix

我对在实时操作系统中使用消息队列感到非常困惑。给出的代码似乎将消息队列用于骨骼:即使将变量传递给另一个类对象也是通过MQ完成的。我总是在IPC中使用MQ的概念。问题是:什么是消息队列的正确使用?

2 个答案:

答案 0 :(得分:7)

在实时操作系统环境中,您经常遇到必须保证按固定时间表执行代码的问题。例如。你可能有一个函数,每10毫秒被称为完全。不早,不迟。

为了保证这种硬时序约束,您必须编写在任何情况下都不能阻止时间关键代码的代码。

此处不能使用posix线程同步原语。 您永远不能从时间关键代码中锁定互斥锁或aqurie信号量,因为不同的进程/线程可能已将其锁定。但是,通常您可以从时间关键代码中解除阻塞其他一些线程(例如,释放信号量是可以的)。

在这样的环境中,消息队列是交换数据的不错选择,因为它们提供了一种干净的方式将数据从一个线程传递到另一个线程而不会阻塞。

使用队列来设置变量可能听起来有些过分,但它是非常好的软件设计。如果你这样做,你就有了一个明确定义的时间关键代码接口。

编写确定性代码也很有帮助,因为你永远不会遇到竞争条件的问题。如果通过消息队列设置变量,则可以确保时间关键代码以与发送时相同的顺序查看消息。混合直接内存访问和消息时,无法保证这一点。

答案 1 :(得分:0)

当需要在两个不同进程之间交换数据时,消息队列主要用作 IPC机制。但是,有时消息队列也用于线程上下文切换。例如:
您使用位于驱动程序之上的软件层注册了一些回调。回调将在驱动程序的上下文中返回给您。它是由驱动程序生成的线程。现在你不能通过在其中进行大量处理来占用这个驱动程序的线程。因此,可以在消息队列中添加回调中返回的数据,队列中的应用程序线程被阻塞以执行对数据的处理。

我不明白为什么人们应该使用Message Queues替换正常的函数调用。