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 ...
随机推荐
- linux中如何修改最大文件句柄数
1.使用ulimit -a可以查看,其中的open files后面的数就是最大文件句柄数 2.临时方法:使用ulimit -n size修改最大文件句柄数(这种方法只针对当前进程有效) 3.永久方法: ...
- Java连接Memcached进行CRUD
参考这篇博文在本机安装了Memcached 在 Java 中常用的memcached有三个: Memcached Client for Java SpyMemcached XMemcached 这里使 ...
- POJ 3616 Milking Time ——(记忆化搜索)
第一眼看是线段交集问题,感觉不会= =.然后发现n是1000,那好像可以n^2建图再做.一想到这里,突然醒悟,直接记忆化搜索就好了啊..太蠢了.. 代码如下: #include <stdio.h ...
- csp-s模拟90
T1: 每格的不透明度相当与一个边权,转化为从起点到终点所有路径的最大值.实现最长路,最好用$dijk$. T2: 对于$N=100$,$M=8$,考虑状压$dp$.要用一种状态表示某一行的矩形覆盖情 ...
- CISCO实验记录十:switch基本配置
1.交换机IP配置 2.配置telnet 1.交换机IP配置 #interface vlan 1 #ip address 192.168.0.3 255.255.255.0 #no shutdown ...
- pwn学习日记Day14 《程序员的自我修养》读书笔记
目标文件:计算机科学中存放目标代码的计算机文件,包含着机器代码,代码在运行时使用的数据,调试信息等,是从源代码文件产生程序文件这一过程的中间产物. 目标代码(objectcode)指计算机科学中编译器 ...
- BufferedWriter中write与close函数使用
BufferedWriter 是一个缓冲字符输出流,可以将要输出的内容先缓冲到一个字符数组中,等字符数组满了才一次性写到输出流内,默认的字符数组长度为8192.使用BufferedWriter 时需要 ...
- web前端——Vue.js基础学习之class与样式绑定
打着巩固 css 知识的旗号开始了对 vue 样式绑定的研究,相比前一篇的 demo,本次内容多了各种样式在里面,变得稍微花哨了些,话不多说,直接上代码吧: <html> <head ...
- word里快捷输入分割线
- C之静态内存和动态内存
静态内存: * 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 动态内存: * 程序员自己申请 * new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* ja ...