教程
** &**表示当 ;44+ 的时候就取消子线程,该函数将导致子线
程直接退出,不会执行上面紫色的 ) 部分的代码,即释放空间失败。要想释放指针类型的变量
,此时必须要用 和 函数释放空间,见后面的例子
=
$4+&
#$""'$&**等待子线程释放空间,并获取子线程的返回值
)6$:;<6#$&
+&
=
3.2. 线程的取消
线程也可以被其它线程杀掉,在 中的说法是一个线程被另一个线程取消。
线程取消的方法是一个线程向目标线程发 信号,但是如何处理 信号则由目标线程自
己决定,目标线程或者忽略、或者立即终止、或者继续运行至 ,取消点后终止。
取消点:
根据 CD8E 标准,
、、、、、%
等函数以及 、等会引起阻塞的系统调用都是 ,,而其他 函数
都不会引起 动作。但是 的手册页声称,由于 线程库与 库结合得不
好,因而目前 库函数都不是 ,;但 1(> 信号会使线程从阻塞的系统调用中退出,
并置 >8(/? 错误码,因此可以在需要作为 , 的系统调用前后调用
,从而达到 CD8E 标准所要求的目标,即如下代码段:
&
4)#F))#%&
&
但是从 ?7G + 的实际测试来看,至少有些 库函数的阻塞函数是取消点,如 #%
等,而 函数不管线程是否设置了
/7?>1H1(>H8D1I>#(,都起到取消点作用。总之,线程的取
消一方面是一个线程强行杀另外一个线程,从程序设计角度看并不是一种好的风格,另一方面目前
本身对这方面的支持并不完善,所以在实际应用中应该谨慎使用!!
&**尽量不要用, 支持并不完善
3.3. 线程终止清理函数
不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退
出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必
须考虑解决的问题。
最经常出现的情形是资源独占锁的使用:线程为了访问临界共享资源而为其加上锁,但在访问
过程中该线程被外界取消,或者发生了中断,则该临界资源将永远处于锁定状态得不到释放。外界
取消操作是不可预见的,因此的确需要一个机制来简化用于资源释放的编程。
在 CD8E 线程 18 中提供了一个 *函数对用于自动释
放资源,,从 的调用点到 之间的程序段中的终止动作都将
执行 所指定的清理函数。18 定义如下:
$$"$"#$"%
$