企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
[TOC] ## 死锁 死锁的四个条件只要破坏一个,死锁就不会发生 1. **互斥(Mutual Exclusion)** * 资源一次只能被一个线程占用。 2. **占有且等待(Hold and Wait)** * 一个线程已持有一个资源,同时又在等待其他资源。 3. **不可剥夺(No Preemption)** * 资源不能被强制夺走,只能主动释放。 4. **循环等待(Circular Wait)** * 形成资源请求的循环链,线程 A 等线程 B 的资源,线程 B 等线程 C 的资源……最后又等回线程 A。 **为什么破坏互斥几乎做不到预防死锁** 1. 很多资源天生就不能共享 例子:打印机、摄像头、文件写句柄。 如果两个进程同时写同一个打印机,输出会变成乱码 → 功能直接失效。 2. 破坏互斥等于让资源可共享,会引发数据不一致 例子:两个线程同时修改同一条数据库记录,没有加锁,可能写出错误数据 → 破坏系统正确性。 3. 有些“可共享”方案成本极高 例如虚拟化打印机(把任务缓存到 spooler,再排队打印),本质上还是通过增加中间层重新引入互斥,并没真正消除互斥需求。 **所以** * **但在现实中,互斥条件几乎是无法破坏的**,因为它是系统正确运行的保障。 * 所以实际系统中,**死锁预防**常从**破坏占有且等待**、**循环等待**、**不可剥夺**三个条件入手,而不是互斥。