POSIX消息队列 - mq_send线程唤醒命令
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POSIX消息队列 - mq_send线程唤醒命令相关的知识,希望对你有一定的参考价值。
有人可以向我解释消息队列如何处理唤醒在单个消息队列上阻塞的多个线程?
我的情况是我在一个完整的消息队列上阻塞了多个编写器,每个编写的消息优先级等于线程优先级。我想确保它们以优先顺序唤醒和发布,但是我的应用程序表现得好像它们按FIFO顺序唤醒(即它们阻止的顺序)。每个阻塞线程都使用SCHED_FIFO策略进行调度,该策略具有与系统级别范围不同的优先级。
我已经在互联网上搜索了一些描述如何工作的内容,我所能找到的只是POSIX手册页描述了如果支持优先级调度,多个阻止程序将按优先级顺序唤醒。由于内核调度程序是优先级调度程序,我认为线程将按优先级顺序唤醒并发布到队列,但似乎并非如此。我确信我只是遗漏了一些微妙的细节,并希望这个列表中的专家能够帮助我了解我所看到的内容,因为在内核级别上这些线程已准备好运行。
我有一个小测试应用程序,如果有必要我可以在这里发布。它只是填充队列,然后有几个线程都尝试并写入它,所有线程优先级不同,并且发布的消息优先级等于线程优先级。然后我从队列中删除一条消息,并期望最高优先级的线程唤醒并发布其消息。但是,要等待的第一个线程首先发布其消息。
任何帮助或文档,任何人可以指出我,以便深入了解这个?
提前致谢!
事实证明,如果队列已满,Linux内核会查看任务的优先级值,并以任务友好顺序将其添加到等待队列(这是非RT任务的优先级顺序)。等待队列不符合我的应用程序使用的实时优先级。非RT优先级(漂亮的值)正在正确处理并以良好的顺序唤醒。
在将任务添加到内部内核等待队列时,我的问题的根本原因在于内核如何处理优先级。我向linux-kernel列表提交了一个补丁,该补丁已被接受,并将被用于未来的版本,这些版本在将任务添加到等待队列时更改了优先级检查 - 它现在既支持非RT优先级又支持RT优先级。它不处理截止日期计划任务的优先级。
以上是关于POSIX消息队列 - mq_send线程唤醒命令的主要内容,如果未能解决你的问题,请参考以下文章
如何在linux中使用POSIX API发送带有消息队列的整数?