线程饿死(Starvation):为什么有线程永远拿不到资源
副标题 / 摘要 线程饿死并不是死锁,但同样会让系统“挂住”。本文解释饿死的原因与工程解决办法。 目标读者 处理高并发系统的后端工程师 需要理解调度与锁的开发者 负责性能与稳定性的技术负责人 背景 / 动机 在多线程系统中,即使没有死锁,某些线程也可能长期得不到资源。 这会造成延迟暴涨、任务超时与系统不公平。 核心概念 饿死(Starvation):线程长期无法获得所需资源 不公平锁:没有公平队列的锁 优先级反转:低优先级阻塞高优先级 实践指南 / 步骤 优先使用公平锁或限时锁 避免长时间占有锁 在关键路径引入超时与降级 监控等待队列长度与等待时间 可运行示例 # 简化“饿死”示意:高优先级任务不断插队 def scheduler(high_tasks, low_tasks, steps=6): done = [] for _ in range(steps): if high_tasks: done.append(high_tasks.pop(0)) # 高优任务持续补充 high_tasks.append("H") elif low_tasks: done.append(low_tasks.pop(0)) return done if __name__ == "__main__": print(scheduler(["H", "H"], ["L1", "L2", "L3"])) 解释与原理 当调度策略持续优先处理高优任务时,低优任务可能永远排不到。 这不是死锁,而是不公平调度导致的饥饿现象。 常见问题与注意事项 饿死一定是 bug 吗? 可能是设计问题,比如不公平调度策略。 公平锁就一定没问题吗? 不一定,公平锁可能降低吞吐。 如何定位饿死问题? 观察锁等待时间、队列长度与任务超时。 ...