【问题标题】:POSIX message queue - mq_send thread wake orderPOSIX 消息队列 - mq_send 线程唤醒顺序
【发布时间】:2018-04-09 08:03:25
【问题描述】:

谁能向我解释消息队列如何处理唤醒多个 线程阻塞在单个消息队列上?

我的情况是我有多个作者阻止了一条完整的消息 队列,每个发布消息的优先级等于线程 优先。我想确保他们按优先顺序醒来和发帖, 但是我的应用程序表现得好像它们以 FIFO 顺序唤醒 (即他们阻止的顺序)。每个阻塞线程都是 使用具有不同优先级的 SCHED_FIFO 策略进行调度 系统级范围。

我在互联网上到处搜索,寻找描述如何 这应该可以工作,我能找到的只是描述它的 POSIX 手册页 多个阻塞器按优先级顺序唤醒如果优先级调度是 支持。由于内核调度器是一个优先级调度器我 会认为线程会按优先级顺序唤醒并发布到 队列,但情况似乎并非如此。我确定我是 只是错过了一些微妙的细节,并希望这里的专家 这个列表可以帮助我了解我所看到的,因为它在 这些线程准备好运行的内核级别。

我有一个小型测试应用程序,如有必要,我可以在此处发布。它只是填充一个队列,然后有几个线程都尝试写入它,所有线程都具有不同的线程优先级,并以等于线程优先级的消息优先级发布。然后我从队列中删除一条消息,并期望最高优先级的线程唤醒并发布它的消息。但是,第一个等待的线程首先发布它的消息。

任何人都可以指出我的帮助或文档以便深入了解此问题?

提前致谢!

【问题讨论】:

  • 您是否验证了所创建线程的优先级是您想要的?通常,pthread_create(3) 将新线程的优先级设置为继承创建线程的优先级,因此即使您在创建线程时将新优先级作为调度参数传递,除非您明确告知,否则该值将被忽略。
  • 是的,我已经确认优先级是正确的。我明确设置它们,或者在传递给 pthread_create() 的 pthread_attr_t 中,或者在使用 std::thread 时调用 pthread_setschedparam()。

标签: linux linux-kernel posix ipc message-queue


【解决方案1】:

事实证明,如果队列已满,Linux 内核会查看任务的优先级值,并将它们按任务优先顺序(非 RT 任务的优先级顺序)添加到等待队列中。等待队列不尊重我的应用程序使用的实时优先级。非 RT 优先级(不错的值)正在被正确处理,并按顺序唤醒。

问题的根本原因在于,在将任务添加到内部内核等待队列时,内核如何处理优先级。我向 linux-kernel 列表提交了一个补丁,该补丁已被接受并将滚动到未来的版本中,该补丁在将任务添加到等待队列时更改了优先级检查——它现在同时支持非 RT 优先级和 RT 优先级。它不处理截止日期计划任务的优先级。

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 2019-03-17
    • 1970-01-01
    • 2020-11-27
    • 2015-06-02
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多