线程取消引起的异常及解决方案

线程取消引起的异常及解决方案

本篇文章围绕以下几个问题展开:

  1. 线程取消是什么?
  2. 为什么线程取消会引起异常?
  3. 如何解决线程取消出现的异常?

线程取消是什么

单个线程有三种退出方式,分别是线程运行完成后自动返回、线程调用phtread_exit、线程被其他线程取消。综上所述,线程取消是一种可以被其他线程控制的退出方式。
线程取消分两种,一种是推迟取消,一种是异步取消。
线程取消的步骤如下
1.B线程给A线程发送取消请求。
2.A线程接收到取消请求
3.A线程判断线程取消状态是否使能?如果使能则进行下一个步骤。
4.判断线程取消的方式是哪一种?如果线程取消的方式是推迟取消,执行步骤5.如果线程取消的方式是推迟取消,则直接执行线程取消。
5.当程序运行到系统定义的取消点或者程序设置的取消点时,执行线程取消。

为什么线程取消会引起异常

一般来说,线程间存在共享的数据。为确保共享数据进行的操作是原子的,一般使用互斥锁、读写锁等变量。如果线程被取消时线程中的变量使用了锁却未解锁,就会导致锁一直被占用的情况。如果其他线程对这一个锁直接进行锁操作,就会导致该线程死锁。

如何解决线程取消出现的异常

	如果线程配置为异步取消方式,不建议使用互斥锁等变量。
	如果线程配置为推迟取消方式,有方法解决线程取消出现的异常。
	由于线程在退出时会先执行线程清理函数,所以可以利用线程清理函数解决线程取消出现的异常。
	如果线程使用读写锁且在锁与解锁之间存在取消点函数时,解决线程取消出现的异常的步骤如下:
	1.在锁前向清理函数栈压入解锁函数。
	2.在解锁后向清理函数栈弹出解锁函数。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值