Pthread_cancel 线程取消|学习笔记

简介: 快速学习 Pthread_cancel 线程取消

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频Pthread_cancel 线程取消】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11063


Pthread_cancel 线程取消

 

内容介绍:

一、有关线程的相关定义

二、线程的取消状态

 

一、有关线程的相关定义

1.线程取消定义

在同一个进程中,两个线程可以互相取消。 pthread cancel 函数的实质是发信号给目标线程 thread 。使目标线程退出。即线程取消的原理就是发信号。

此函数只是发送终止信号给目标线程,不会等待取消目标线程执行完才返回。然而发送成功并不意味着目标线程一定就会终止,线程被取消时,线程的取消属性会决定线程能否被取消以及何时被取消。

2.线程的取消状态

即线程能不能被取消,可以在线程中设置。

3.线程取消点(线程可以被取消的前提下才存在)

即线程被取消的地方

4.线程的取消类型

是立马被取消结束还是执行到取消点的时候被取消结束

 

二、线程的取消状态

即线程能不能被取消

在 Linux 系统下,线程默认可以被取消。编程时可以通过 pthread setcancelstate 函数设置线程是否可以被取消

pthread setcancelstate设置取消状态 (int state,int * old_state);其中

state:

是现在的的状态;

PTHREAD_CANCEL_DISABLE :不可以被取消

PTHREAD_CANCEL_ENABLE :可以被取消。

old _state :

保持了以前的取消状态,即保存调用线程原来的可取消状态的内存地址。

pthread cancel 函数很简单,其后加目标线程的线程号就可以。

例:05 pthread setcancelstatec 验证设置线程能\否被取消,然后看线程能不能被取消

在 main 函数中创建一个线程,在线程里设置取消状态,循环,等待线程取消。 main 函数为主线程,主线程创建完线程一之后 sleep 3秒,3秒钟之后取消线程一,等待线程一结束之后回收线程资源,程序结束。

如果线程取消不了,程序就会一直在join上循环。

#include <stdio.h>

#include <unistd.h>

#include <pthread.h>

void *thread_cancel(void *arg)

{

//pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);PTHREAD_CANCEL_ENABLE 为允许取消,3秒后主线程取消程序

//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);PTHREAD_CANCEL_DISABLE为不允许取消,3秒后主线程取消不了程序,程序就会一直在 join 上循环,线程不会结束,这个 cancel 线程就是失败的。

此程序是验证当前线程允不允许被取消的。

经验证,如果没有设置是否允许取消,默认是允许线程取消的

while(1)   设置线程取消状态

{

Printf(“this is my new thread_cancel\n”);

Sleep(1);

}

return NULL;

}

Int main(int argc, char *argv[] )

{

pthread_t tid1;

int ret =0:

pthread_create(&tid1,NULL,thread_cancel,NULL);在函数中创建一个线程

if(ret!=0)

perror(“pthread_create”);

sleep(3);三秒钟之后

pthread_cancel(tid1);主线程去取消线程1

pthread_join(tid1,NULL);如果取消不了就一直在join上循环

return 0;

}

相关文章
|
测试技术 Windows
【动态规划】【位运算】1787. 使所有区间的异或结果为零
【动态规划】【位运算】1787. 使所有区间的异或结果为零
|
3月前
|
人工智能 自然语言处理 语音技术
阿里云百炼官网首页登录入口:开通百炼,每个大模型免费100万Tokens
阿里云百炼平台现开放免费领Token福利,开通即享超5000万额度。提供大模型推理、部署及训练服务,涵盖通义千问、万相等多个系列模型。前台介绍平台详情与价格,后台支持API-Key申请及管理操作。
1000 8
|
存储 算法 安全
SM2解密
【10月更文挑战第5天】SM2解密
760 11
|
10月前
|
存储 前端开发 数据可视化
Grafana Loki,轻量级日志系统
本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。
3815 70
Grafana Loki,轻量级日志系统
|
前端开发 JavaScript
HTTP协议下可拖动时间轴播放FLV的实现(伪流媒体)
HTTP协议下实现FLV的播放其实并不复杂,当初实现的原理是使用了flowPlayer插件实现的,效果还不错。但仍有两大问题影响着客户的访问情绪: 1.预加载时页面卡死,似乎没有边下边播。 2.偶尔边下边播,却无法拖动时间轴至未下载的部分。
2162 0
|
Shell Linux Android开发
android 设备唯一码的获取,Cpu号,Mac地址
转:http://blog.csdn.net/hpccn/article/details/7872141 开发Android应用中,我们常常需要设备的唯一码来确定客户端。 Android 中的几中方法,使用中常常不可靠 1. DEVICE_ID 假设我们确实需要用到真实设备的标识,可能就需要用到DEVICE_ID。
2288 0
|
API
如何自定义destoon的地址生成规则
在使用destoon的过程中需要对地址规则进行重写,那么如何实现,destoon的列表的地址规则是定义在/api/url.inc.php,然后又是在include/global.func.php中进行的listpages这个函数调用实现 if($page &lt; 1 || $page &gt; $total) $page = 1; $home_url = $MOD['linkurl'
1208 0
|
3天前
|
数据采集 人工智能 安全