异步线程学习笔记(三)阻塞

线程阻塞既是:
如果线程执行由于某种原因暂停,则可以认为线程阻塞。
我们常见的线程阻塞有:
hread.Sleep和Thread.Join方法
被阻塞的线程的基本操作原理:
被阻塞的线程会立刻将其处理器的时间片转移给其他线程,从此不再消耗处理器的时间,知道阻塞条件被满足。
判断线程是否被阻塞:
我们可以通过Thread.State来判断线程状态,值得一提的是,Thread.State是一个flag enum,可以通过二进制表示线程状态。

十进制数Thread.State备注
0Running线程启动
1StopRequested请求线程停止
2SuspendRequested请求线程挂起
4Background后台线程执行转台
8Unstarted尚未对线程调用start
16Stopped线程停止
32WaitSleepJoin线程已阻塞,可能调用了sleep或者join方法
64Suppended线程已挂起
128AbortRequested已经对线程调用了abort方法,但是线程未收到ThreadAbortException
256Abort线程已死,但是未将状态修改为Stooped

需要注意的是,Threadstate只适合诊断线程状态,但是不适用于线程同步,因为线程的状态可能在测试threadstate与对信息进行操作时候发生变化

阻塞对应的便是非阻塞(Unblocking)
非阻塞发生的条件:
1)阻塞条件被满足了
2)操作超时了
3)thread.interrupt打断了
4) thread.abort进行中止

除此自外,我们还需要了解上下文切换:
当线程阻塞或者解除阻塞,操作系统至少需要进行一次上下文切换
,并且产生适量的开销(1~2us)。

阻塞也有不同的类型:主要是IO-Bound和CPU-Bound
当线程花费大量时间用来等待某件事情发生,这便是IO-Bound,这里涉及了输入输出,Thread.sleep也是一种输入输出操作。比如说:
在线程上同步等待:console.readkey,thread.sleep,thread.join
异步操作:在委托完成后进行要等待一个回调函数。
当线程花费大量时间进行CPU密集操作,这便是CPU-Bound,这里有一个自旋需要了解:
while(datetime.now<nextstarttime);

spinning和blocking还是有细小的区别的:
在几微妙时间内条件满足的话可以使用短spinning,这样可以避免上下文开销与切换。

值得注意的是,阻塞并不是零成本,线程生存期间会占用1MB的内存,给CLR与操作系统带来开销。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值