线程取消引起的异常及解决方案
线程取消引起的异常及解决方案
本篇文章围绕以下几个问题展开:
- 线程取消是什么?
- 为什么线程取消会引起异常?
- 如何解决线程取消出现的异常?
线程取消是什么
单个线程有三种退出方式,分别是线程运行完成后自动返回、线程调用phtread_exit、线程被其他线程取消。综上所述,线程取消是一种可以被其他线程控制的退出方式。
线程取消分两种,一种是推迟取消,一种是异步取消。
线程取消的步骤如下
1.B线程给A线程发送取消请求。
2.A线程接收到取消请求
3.A线程判断线程取消状态是否使能?如果使能则进行下一个步骤。
4.判断线程取消的方式是哪一种?如果线程取消的方式是推迟取消,执行步骤5.如果线程取消的方式是推迟取消,则直接执行线程取消。
5.当程序运行到系统定义的取消点或者程序设置的取消点时,执行线程取消。
为什么线程取消会引起异常
一般来说,线程间存在共享的数据。为确保共享数据进行的操作是原子的,一般使用互斥锁、读写锁等变量。如果线程被取消时线程中的变量使用了锁却未解锁,就会导致锁一直被占用的情况。如果其他线程对这一个锁直接进行锁操作,就会导致该线程死锁。
如何解决线程取消出现的异常
如果线程配置为异步取消方式,不建议使用互斥锁等变量。
如果线程配置为推迟取消方式,有方法解决线程取消出现的异常。
由于线程在退出时会先执行线程清理函数,所以可以利用线程清理函数解决线程取消出现的异常。
如果线程使用读写锁且在锁与解锁之间存在取消点函数时,解决线程取消出现的异常的步骤如下:
1.在锁前向清理函数栈压入解锁函数。
2.在解锁后向清理函数栈弹出解锁函数。