最近与一位同事进行了讨论 - 由于固有的非确定性,使用队列进行线程间通信(例如 FreeRTOS)对于“实时”嵌入式系统来说是否是一个糟糕的设计?
您当然可以不恰当地使用队列来产生糟糕的设计,但使用队列本质上并不是糟糕的设计。
当数据偶尔产生的速度快于消耗的速度时,队列用于传递数据(但平均而言,消耗的速度必须快于产生的速度)。
队列的大小、阻止/阻塞/超时行为、生产者和消费者线程的相对优先级以及这些线程的实时约束都是非常重要的设计考虑因素,它们可能会破坏您的设计,而不仅仅是决定使用队列。
您可以通过将队列的长度设置为 1 来确定性地使用队列(或者某些 RTOS 具有类似的“邮箱”原语)。 这通常比互斥锁保护的共享内存和半量/事件标志信号更简单,以实现相同的语义。
通常生产者的优先级高于消费者,但如果消费者在生产者生成多条消息期间可能不在队列中等待,则队列提供的缓冲可能仍然有用。 尽管在这种情况下我会质疑线程设计和优先级分配的适当性,而不是单独使用队列。
涉及队列的“良好”设计应该考虑排队论的数学。
总而言之,设计需要整体考虑,使用队列本身既不是好设计,也不是坏设计,如果两者都不好,就说明了这一点。