线程的退出

本文深入探讨了POSIX线程库中的线程取消机制,包括如何安全地在子线程中实现取消点,避免死锁和资源泄露。通过具体代码示例,讲解了pthread_setcancelstate和pthread_testcancel的使用,以及在临界资源操作中如何正确处理取消信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

伪代码描述如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

void* subThread(void*)

{

  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldCancleState);

  …;//不存在获取临界资源操作,可以安全退出的代码块

  pthread_testcancel();//如果可以安全退出的代码块不存在取消点操作,可以自己添加pthread_testcancel调用,线程执行到这个调用就会退出

  /*还有一种方法,在可以安全退出的代码块,我们将线程的可取消类型设置成PTHREAD_CANCEL_ ASYNCHRONOUS,这样即使没有取消点也可以马上退出*/

 

  pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,&oldCancleState);

  /*存在获取-释放临界资源操作,如果在lock和unlock之间的运行收到cancel信号,且可取消状态为enable,则锁永远无法被释放*/

  Lock();

  …;

  Unlock();

}

 

void* mainThread(void*)

{

  pthread_cancel(subThread);//给subThread发送退出信号

  pthread_join(subThread,null);//进入休眠,直到subThread退出成功

}

无论使用哪种方式,核心点就是要保证线程退出的时候不会获取了某些临界资源而无法释放

POSIX.1定义的取消点见下:

注意:当主线程调用pthread_cancel接口后,只是将取消请求发送给指定线程,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值