rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

Fix missing schedule when thread actively suspends itself

Open mouch6131 opened this issue 6 months ago • 5 comments

拉取/合并请求描述:(PR description)

[

为什么提交这份PR (why to submit this PR)

线程在主动挂起自己的时候,只是把自己加到suspend list,而没有发起调度,这就导致当前线程还会继续执行,直到tick或者其他线程发起调度

你的解决方案是什么 (what is your solution)

在rt_thread_suspend_to_list函数中判断是否属于主动挂起自己,在这种情况下主动发起调度

请提供验证的bsp和config (provide the config and bsp)

在rk3588板子上验证成功

]

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • [ ] 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • [1 ] 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • [1 ] 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • [1 ] 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
  • [1 ] 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • [1 ] 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • [1 ] 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • [1 ] 代码是高质量的 Code in this PR is of high quality
  • [1 ] 已经使用formatting 等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
  • [ ] 如果是新增bsp, 已经添加ci检查到.github/workflows/bsp_buildings.yml 详细请参考链接BSP自查

mouch6131 avatar Jun 14 '25 09:06 mouch6131

CLA assistant check
All committers have signed the CLA.

CLAassistant avatar Jun 14 '25 09:06 CLAassistant

📌 Code Review Assignment

🏷️ Tag: kernel

Path: src
Reviewers: @GorrayLi @lianux-mm @wdfk-prog

Changed Files (Click to expand)
  • src/thread.c

📊 Current Review Status (Last Updated: 2025-06-14 09:07 UTC)

  • @GorrayLi Pending Review
  • @lianux-mm Pending Review
  • @wdfk-prog Pending Review

📝 Review Instructions

  1. 维护者可以通过单击此处来刷新审查状态: 🔄 刷新状态 Maintainers can refresh the review status by clicking here: 🔄 Refresh Status

  2. 确认审核通过后评论 LGTM/lgtm Comment LGTM/lgtm after confirming approval

  3. PR合并前需至少一位维护者确认 PR must be confirmed by at least one maintainer before merging

ℹ️ 刷新CI状态操作需要具备仓库写入权限。 ℹ️ Refresh CI status operation requires repository Write permission.

github-actions[bot] avatar Jun 14 '25 09:06 github-actions[bot]

  • 请问是使用了什么函数,才会有线程在主动挂起自己的时候,只是把自己加到suspend list,而没有发起调度的情况呢?
  • 我发现ipc的所有函数,在执行rt_thread_suspend_to_list之后都有rt_schedule的执行
  • 例如https://github.com/RT-Thread/rt-thread/blob/169d84d65adbddf4e08fea812af15f4ca51f389a/src/ipc.c#L1406-L1449

wdfk-prog avatar Jun 14 '25 09:06 wdfk-prog

这部分在文档中明确有提及到,如果是suspend自己的操作需要自己后续主动进行一次调度。

BernardXiong avatar Jun 14 '25 10:06 BernardXiong

请问是使用了什么函数,才会有线程在主动挂起自己的时候,只是把自己加到suspend list,而没有发起调度的情况呢?

  • 就是线程自己主动调用rt_thread_suspend(rt_thread_self());,然后等其他线程去resume它。

这部分在文档中明确有提及到,如果是suspend自己的操作需要自己后续主动进行一次调度

  • 那不做成自动的原因是什么,是这个当前线程的判断不可靠,比如在中断上下文就需要额外考虑吗?或者是这个函数用的地方太多,那放到更上层的rt_thread_suspend如何。我翻了一下文档,确实是有明确说明,但是很多工程师开发的时候其实并不会认真从头到尾看一遍文档,特别是那些有其他平台经验的工程师更习惯直接上手,比如freertos我看它的处理是有判断当前线程,然后自动调用schedule的。

mouch6131 avatar Jun 14 '25 11:06 mouch6131

请问是使用了什么函数,才会有线程在主动挂起自己的时候,只是把自己加到suspend list,而没有发起调度的情况呢?

  • 就是线程自己主动调用rt_thread_suspend(rt_thread_self());,然后等其他线程去resume它。

这部分在文档中明确有提及到,如果是suspend自己的操作需要自己后续主动进行一次调度

  • 那不做成自动的原因是什么,是这个当前线程的判断不可靠,比如在中断上下文就需要额外考虑吗?或者是这个函数用的地方太多,那放到更上层的rt_thread_suspend如何。我翻了一下文档,确实是有明确说明,但是很多工程师开发的时候其实并不会认真从头到尾看一遍文档,特别是那些有其他平台经验的工程师更习惯直接上手,比如freertos我看它的处理是有判断当前线程,然后自动调用schedule的。

希望suspend接口简单一些,把是否进行调度放到函数外自行来处理,而不是一刀切的方式进行调度。如果确实需要考虑,那么应该是提供两份API,一个是只suspend,一个是suspend后进行一次调度。

BernardXiong avatar Jun 16 '25 13:06 BernardXiong