[kernel] Prevent duplicate defunct enqueue for deleted threads.#11519
[kernel] Prevent duplicate defunct enqueue for deleted threads.#11519Rbb666 wants to merge 1 commit into
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: kernelReviewers: GorrayLi ReviewSun hamburger-os lianux-mm wdfk-prog xu18838022837 Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-06-26 12:40 CST)
📝 Review Instructions
|
|
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
RT-Thread 线程正常退出时会通过 _thread_exit() 进入 defunct 队列,随后由 idle/system defunct 线程完成资源回收。但应用层仍可能误调用 rt_thread_delete() 或 rt_thread_detach(),导致同一个线程被重复加入 defunct 队列,存在链表破坏、重复销毁和资源回收异常的风险。
这类误用在实际 APP 中比较容易出现,例如线程主循环自然退出后,外部管理逻辑又再次删除线程,因此内核侧需要提供保护,避免应用层错误使用直接破坏线程生命周期管理。
你的解决方案是什么 (what is your solution)
为线程调度上下文增加 sched_flag_defunct 标志,用于记录线程是否已经进入 defunct 队列,并在 rt_sched_thread_init_ctx() 中初始化。
新增 _thread_mark_defunct(),通过线程自身的 spinlock 保护该标志的检查和设置,确保 _thread_exit()、rt_thread_delete()、rt_thread_detach() 只有第一次能将线程加入 defunct 队列。后续重复 delete/detach 会返回错误,不再重复执行 mutex detach 和 defunct enqueue。
同时补充 core.thread_tc 回归测试,覆盖:
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up