有人能向我解释消息队列是如何处理单个消息队列上阻塞的多个线程的吗?
我的情况是,有多个写入器阻塞一个完整的消息队列,每个发送消息的优先级等于线程优先级。我想确保他们以优先级顺序唤醒和发布,但是我的应用程序的行为就好像他们是以FIFO顺序(即他们阻塞的顺序)醒来一样。每个阻塞线程都使用具有系统级别范围的不同优先级的SCHED_FIFO策略进行调度。
我在互联网上到处搜索一些描述它应该如何工作的东西,我所能找到的只有POSIX手册页,它们描述了如果支持优先级调度的话,多个阻止程序会以优先级顺序唤醒。由于内核调度程序是一个优先级调度器,所以我认为线程会按优先级顺序唤醒并发送到队列,但是情况似乎并非如此。我确信我只是遗漏了一些微妙的细节,并希望这个列表中的专家能够帮助我了解我所看到的,因为在内核级别,这些线程已经准备好运行了。
我有一个小的测试应用程序,我可以在这里张贴,如果必要的话。它只需填充一个队列,然后有几个线程都尝试并写入队列,所有线程都具有不同的线程优先级,并且发布的消息优先级与线程优先级相等。然后,我从队列中删除一条消息,并期望优先级最高的线程唤醒并发布它的消息。但是,等待的第一个线程首先发布它的消息。
任何帮助或文件,任何人都可以指向我,以了解这件事的真相?
提前感谢!
发布于 2018-01-04 16:38:39
结果是,如果队列已满,Linux内核会查看任务的优先级值,并按照任务的正确顺序(这是非RT任务的优先级顺序)将它们添加到等待队列中。等待队列不符合我的应用程序使用的实时优先级。非RT优先级(很好的值)正在被妥善处理,并以良好的顺序醒来。
我问题的根源在于内核在将任务添加到内部内核等待队列时是如何处理优先级的。我向linux内核列表提交了一个补丁,该修补程序已被接受,并将被滚动到以后的版本中,该版本在向等待队列中添加任务时更改优先级检查--它现在授予非RT优先级和RT优先级。它不处理截止日期预定任务的优先级。
https://stackoverflow.com/questions/46979725
复制相似问题