pthread_cancel 相关
假设线程A对线程B发出了一个取消请求。通过如下函数:
#include <pthread.h>
int pthread_cancel(pthread_t thread); 参数:
thread - 收到取消请求的线程id 返回值:
发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着thread会终止。
线程B如何反应呢?
这取决线程的两个状态属性,它们决定了该线程收到取消请求时的行为,下面给出这两个字段的意义和用法。
(1)线程的cancelability state
字段可以取值为:enabled (默认) or disabled。当取值为enabled,由cancelability type属性决定线程的行为。当取值为disabled,线程不可被取消,但取消请求还是会被接受。
#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate); 参数:
state - 设置线程的取消state,可以取如下值
PTHREAD_CANCEL_ENABLE(默认取值)
PTHREAD_CANCEL_DISABLE oldstate - 用作保存线程之前的取消state
(2)线程的cancelability type
#include <pthread.h>
int pthread_setcanceltype(int type, int *oldtype); 参数:
type - 取值如下
PTHREAD_CANCEL_DEFERRED(默认取值)
取消请求会被推迟到调用一个是cancellation point的函数,参看http://man7.org/linux/man-pages/man7/pthreads.7.html PTHREAD_CANCEL_ASYNCHRONOUS
线程可以在任何时候被取消。(通常,线程只要接收到取消请求,便会直接被取消。但是系统不保证这一点)。 oldtype - 保存旧的type
一个例子
#include <pthread.h>
#include <unistd.h>
#include <stdio.h> void wait() {
for(int i = ; i < ; i++){
for (int j = ; j < ; j++){
int k = ;
}
}
} void* PrintHello(void* threadid) {
wait();//延时,等待足够时间以至于能够使得这个线程接收到取消请求。不用sleep函数是因为,这里需要测试pthread_testcancel函数是否是取消点,然而sleep也是取消点 pthread_testcancel();// printf("hi\n"); //这一行不会被打印 pthread_exit(NULL);
} int main(){
pthread_t tid;
pthread_create(&tid, NULL, PrintHello, NULL);
pthread_cancel(tid);//对tid对应的线程发送一个取消请求 pthread_exit(NULL);
return ;
}
1.需要的头文件
#include <pthread.h>
2.编译指令
gcc main.c -lpthread
3.相关概念
http://man7.org/linux/man-pages/man3/pthread_setcancelstate.3.html
pthread_cancel 相关的更多相关文章
- 使用 pthread_cancel 引入的死锁问题
先来说一下 pthread_cancel 基本概念. pthread_cancel 调用并不是强制终止线程,它只提出请求.线程如何处理 cancel 信号则由目标线程自己决定,可以是忽略.可以是立即终 ...
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- pthread_cancel
#include <pthread.h> #include <stdio.h> #include<stdlib.h> #include <unistd.h&g ...
- 线程取消 (pthread_cancel)
线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(C ...
- 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
int pthread_join(pthread_t thread, void **retval); int pthread_detach(pthread_t thread); void pthrea ...
- Linux 线程取消(pthread_cancel)
基本概念 pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- SQL Server相关书籍
SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
随机推荐
- 主机,路由器,应用程序,sockets api的关系
- 用tecplot提取数据用于重构模型
本方法还有诸多不完善的地方,转换代码转换格式之后还是需要自己手动分割txt文件,如果数据量太大,手动操作很是辛苦.现在只能得到点的数据,如何重构几何还是问题,UG貌似可以,欢迎交流. 首先在tecpl ...
- G-LAB四月份作业-数据可视化问题探讨
G-LAB四月份作业-数据可视化问题探讨 引子: 数据平台项目建设正在按照公司的计划开展执行中,作为平台建设项目参与者之一,感觉目前我们现有的MIS报表平台数据也不可谓不丰富,但是不论从提供给用户的数 ...
- storm java环境变量设置
storm启动时会加载conf/storm-env.sh文件 编辑 conf/storm-env.sh 添加export JAVA_HOME=/usr/java/jdk1.8.0_111
- C11中的Unicode
在C11(ISO/IEC 9899:2011)标准中引入了对UTF8.UTF16以及UTF32字符编码的支持. 其中,UTF8字符直接通过char来定义,字面量前缀使用u8.比如: char c = ...
- 008-多线程-锁-JUC锁-CyclicBarrier【让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行】
一.概述 “循环栅栏”.大概的意思就是一个可循环利用的屏障. CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).因 ...
- Eclipse项目修改编译jdk版本(Failed to read candidate component class: file 处理)
转: Failed to read candidate component class: file 处理 2018年03月09日 07:15:54 爱萨萨 阅读数 10041 出错现象: org. ...
- Windows Qt 项目中文乱码
在头文件中加入 #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif
- uni-app 时间格式问题 new Date(str) IOS系统跟Android系统不兼容
今天做了一个需求,要在列表中把后台返回来的时间给显示出来,使用 new Date(str) 在微信开发者工具上显示是没有问题的,然后在IOS系统上显示是NAN. 原因是 IOS系统只识别 " ...
- 记录一次vxworks下使用NFS组件的过程
问题:有三块CPU都运行vxworks6.9,现在想要CPU3做server,CPU1-2通过NFS访问CPU3上的文件 补充:使用防火墙可能会影响NFS访问,目前我还没有找到解决办法... 下面是过 ...