ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

tlpi:线程取消(pthread_cancel...)

2021-11-16 18:33:50  阅读:168  来源: 互联网

标签:... 函数 取消 void tlpi int 线程 pthread


线程取消

  • pthread_cancel

    #include<pthread.h>
    int pthread_cancel(pthread_t thread);
    						//成功:返回0    失败:返回正数
    

    函数pthread_cancel()可以向由thread指定的线程发送一个取消请求

    发送取消请求后,函数pthread_cancel()当立即返回,不会等待目标线程的退出

取消的状态和类型

当执行取消操作,即pthread_cancel时,取消的结果取决于取消的状态和类型,可以通过下面的函数进行设置

#include<pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
																	//成功:返回0  失败:返回正数

函数pthread_setcancelstate会将调用线程的取消性状态设置为参数state所指定的状态,pthread_setcanceltype也是一样,state状态有如下两种

  • PTHREAD_CANCEL_DISABLE

    线程不可取消,如果此类线程收到取消请求,那么会将请求挂起,直到将线程的取消状态置为启用

  • PTHREAD_CANCEL_ENABLE

    线程可以取消,这是新建线程取消状态的默认值

如果线程的取消状态为ENABLE,那么取消操作将会取决于取消的类型,有以下两种

  • PTHREAD_CANCEL_ASYCHRONOUS

    可以在任何时点进行取消,但是不常用

  • PTHREAD_CANCEL_DEFERED

    取消请求将保持挂起状态,直到程序运行到取消点,这也是新建线程的默认类型

参数oldstate/oldtype保存了上一次的状态或者类型

取消点

SUSv3规定,如果实现提供有下列函数,那么这些函数必须是取消点,即如果之前有取消请求,那么线程运行到此时必须终止
在这里插入图片描述
程序一旦收到取消请求,且启用了取消状态并将类型置为延迟,那么其会在下一次抵达取消点时终止,这种操作又被称为延迟取消

如果线程取消时未分离,那么为了防止其变成僵尸进程,必须手动对其进行连接,连接之后,返回给pthread_join()的第二个参数为

PTHREAD_CANCELED

可取消性的检测

  • pthread_testcancel

    使用pthread_testcancel()可以产生一个取消点,如果线程已经有处于挂起状态的取消请求,那么他就会立即返回,线程随之终止

    #include<pthread.h>
    void pthread_testcancel(void);
    

清理函数

有时希望在线程结束之前做一些处理工作,如解锁或者清理空间等,此时就需要用到清理函数

每个线程都可以拥有一个清理函数栈,但线程遭到取消时,会沿着该栈自顶向下一次执行清理函数

#include<pthread.h>
void pthread_cleanup_push(void (routine)(void *), void *arg);
void pthread_join_pop(int execute);

顾名思义,pthread_clean_push()可将routine清理函数加入到清理函数栈中,pop()即将栈顶元素弹出

参数解释

arg是作为routine的参数传入

如果execute是非0值,那么执行pthread_join_pop()时就一定会触发栈顶的清理函数,如果为0,也有可能会执行栈顶函数

异步取消

若取消类型为PTHREAD_CANCEL_ASYNCHRONOUS,则为异步取消, 既可以在任何时点进行取消,这势必会造成混乱,尽量少用

标签:...,函数,取消,void,tlpi,int,线程,pthread
来源: https://blog.csdn.net/qq_52554396/article/details/121362097

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有