【编程底层思考】线程阻塞时一定会释放cpu吗

引言

在多线程编程中,理解线程阻塞与CPU资源释放的关系对于优化程序性能至关重要。线程阻塞时是否释放CPU,这取决于阻塞的原因和操作系统的行为。

一、阻塞等待资源

1. 资源阻塞

  • 释放CPU:当线程因为等待某个资源(如锁、信号量、条件变量等)而阻塞时,它通常会释放CPU。

2. 阻塞效果

  • 让出CPU:阻塞的线程不会占用CPU资源,直到它等待的资源变得可用。

流程图:阻塞等待资源

线程等待资源
阻塞状态
释放CPU
资源可用
线程继续执行
继续等待
结束
二、阻塞等待I/O操作

1. I/O阻塞

  • 释放CPU:等待I/O操作(如读取文件、网络通信等)的线程也会释放CPU。

2. 操作系统行为

  • 挂起线程:操作系统将线程挂起,直到I/O操作完成。

流程图:阻塞等待I/O操作

线程等待I/O
阻塞状态
释放CPU
I/O完成
线程继续执行
继续等待
结束
三、阻塞等待用户输入

1. 用户输入阻塞

  • 释放CPU:等待用户输入(如从控制台读取数据)的线程会释放CPU。

流程图:阻塞等待用户输入

线程等待用户输入
阻塞状态
释放CPU
输入就绪
线程继续执行
继续等待
结束
四、主动阻塞

1. 主动阻塞

  • 释放CPU:调用Thread.sleep()Object.wait()等方法主动阻塞的线程会释放CPU。

流程图:主动阻塞

线程主动调用sleep/wait
阻塞状态
释放CPU
时间到/被唤醒
线程继续执行
继续等待
结束
五、阻塞在就绪队列中

1. 就绪队列阻塞

  • 释放CPU:阻塞在就绪队列中的线程(等待条件变量的信号)也会释放CPU。

流程图:阻塞在就绪队列中

线程等待条件变量
阻塞状态
释放CPU
条件满足
线程继续执行
继续等待
结束
六、特殊情况

1. 自旋锁

  • 不释放CPU:在等待锁时“自旋”,即不断检查锁是否可用,而不立即释放CPU。

2. 忙等待

  • 占用CPU:不断检查某个条件是否满足,不释放CPU。

流程图:特殊情况

线程自旋/忙等待
不释放CPU
条件满足
线程继续执行
继续等待
结束
七、总结

大多数情况下,当线程阻塞时,它会释放CPU,以便其他线程可以运行。但是,具体行为可能会因操作系统、编程语言和具体的同步机制而有所不同。了解这些差异有助于编写更高效的多线程程序。

汇总表格
阻塞原因是否释放CPU描述
等待资源等待锁、信号量等
等待I/O等待文件读取、网络通信等
等待用户输入从控制台读取数据
主动阻塞调用sleep/wait方法
阻塞在就绪队列等待条件变量的信号
自旋锁等待锁时不断检查
忙等待不断检查某个条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylanioucn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值