线程取消安全问题

文章目录

  • 线程取消的两个维度
    • 取消状态(State)
    • 取消类型(Type)
      • 推迟取消(DEFERRED)
      • 异步取消(ASYNCHRONOUS)
  • 取消点
    • 作用
    • 示例
  • 清理函数
    • 函数接口
    • 执行时机
    • 解决异步取消的死锁问题
  • 例程:5秒内取消线程的作业
    • 问题:
    • 解决方案1:添加取消点
    • 解决方案2:使用异步取消(需要清理函数)
  • 线程取消是一种请求终止另一个线程执行的机制
  • 类似于进程的信号机制,但是专门用于线程间通信
intpthread_cancel(pthread_tthread);// 发送取消请求

重要:pthread_cancel()只是发送请求,线程是否终止、何时终止取决于线程自身的取消设置

线程取消的两个维度

取消状态(State)

  • 是否接受取消请求
intpthread_setcancelstate(intstate,int*oldstate);
  • state可以是以下两个值之一:
    • PTHREAD_CANCEL_ENABLE:接受取消请求(默认)
    • PTHREAD_CANCEL_DISABLE:拒绝取消请求
  • oldstate:
    • 指向一个 int 类型变量的指针,用于保存线程之前的取消状态
    • 如果不需要保存旧状态,可以将其设置为NULL

取消类型(Type)

  • 如何响应取消请求
intpthread_setcanceltype(inttype,int*oldtype);
  • type是两个值之一:
    • PTHREAD_CANCEL_DEFERRED:推迟到取消点(默认)
    • PTHREAD_CANCEL_ASYNCHRONOUS:立即响应(异步)
  • oldtypeoldstate类似,它保存线程之前的取消类型,如果不需要保存旧类型,也是将其设置为NULL

推迟取消(DEFERRED)

  • 安全,只在预定义的安全点检查取消
// 线程函数void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);// 默认while(1){printf("Working...\n");// 取消点:检查取消请求// 如果在这里收到取消请求,会在printf处响应for(inti=0;i<1000000;i++);// 非取消点,不会响应}returnNULL;}

异步取消(ASYNCHRONOUS)

  • 立即响应,但可能导致资源泄漏和死锁
void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_mutex_lock(&mutex);// 加锁glob++;// 修改共享数据// 可能在这里被立即取消!导致锁未释放!pthread_mutex_unlock(&mutex);// 可能永远执行不到returnNULL;}

取消点

  • 取消点是线程检查是否有取消请求的特定位置
  • 只有在这些位置,线程才会响应推迟的取消请求

作用

  • 保证线程在安全的状态下被取消
  • 避免资源泄漏和数据不一致
// 阻塞型系统调用:read(),write(),accept(),connect()sleep(),usleep(),nanosleep()pthread_cond_wait(),pthread_cond_timedwait()pthread_join(),sem_wait()// 标准I/O函数:printf(),scanf(),fgets(),fread()// 专门函数:pthread_testcancel()// 手动创建取消点

示例

void*thread_func(void*arg){for(inti=0;i<10;i++){printf("Running: %d\n",i);// printf是取消点// 如果没有取消点函数,线程不会检查取消请求for(longj=0;j<1000000000;j++);// 纯循环,不是取消点}returnNULL;}

清理函数

  • 异步取消或在取消点被取消时,线程可能持有资源(锁、内存等)
  • 清理函数确保这些资源被正确释放

函数接口

voidpthread_cleanup_push(void(*routine)(void*),void*arg);voidpthread_cleanup_pop(intexecute);

执行时机

voidcleanup(void*arg){printf("清理资源: %s\n",(char*)arg);}void*thread_func(void*arg){char*resource=malloc(100);pthread_cleanup_push(cleanup,resource);// 压入栈// 以下情况会执行清理函数:// 1. pthread_cancel() 取消线程// 2. pthread_exit() 线程主动退出// 3. pthread_cleanup_pop(1) 显式弹出并执行if(error){pthread_exit(NULL);// 执行清理函数}pthread_cleanup_pop(0);// 弹出但不执行(正常情况)free(resource);// 正常释放returnNULL;}

解决异步取消的死锁问题

  • 问题:
void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_mutex_lock(&mutex);// 加锁glob++;// 可能在这里被取消!sleep(4);// 长时间操作pthread_mutex_unlock(&mutex);// 永远执行不到 → 死锁!returnNULL;}
  • 解决方案:使用清理函数
voidunlock_mutex(void*arg){pthread_mutex_t*mutex=(pthread_mutex_t*)arg;pthread_mutex_unlock(mutex);printf("清理:解锁互斥量\n");}void*thread_func(void*arg){pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_mutex_lock(&mutex);pthread_cleanup_push(unlock_mutex,&mutex);// 注册清理函数glob++;// 即使在这里被取消,清理函数也会执行sleep(4);pthread_cleanup_pop(1);// 弹出并执行清理函数(正常流程也执行)// pthread_mutex_unlock(&mutex); // 不再需要,清理函数已处理returnNULL;}

例程:5秒内取消线程的作业

问题:

// 线程函数没有取消点,即使发送取消请求也不会响应void*ThreadFunc(void*arg){intloops=*((int*)arg);for(intj=0;j<loops;j++){pthread_mutex_lock(&mutex);glob++;pthread_mutex_unlock(&mutex);// 没有取消点!}pthread_exit(NULL);}

解决方案1:添加取消点

void*ThreadFunc(void*arg){intloops=*((int*)arg);// 启用取消pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);for(intj=0;j<loops;j++){pthread_mutex_lock(&mutex);glob++;pthread_mutex_unlock(&mutex);// 定期添加取消点if(j%1000==0){pthread_testcancel();// 手动创建取消点}}pthread_exit(NULL);}// 主线程:5秒后取消intmain(){// ... 创建线程sleep(5);pthread_cancel(tid1);pthread_cancel(tid2);// ...}

解决方案2:使用异步取消(需要清理函数)

voidcleanup_unlock(void*arg){pthread_mutex_unlock(&mutex);}void*ThreadFunc(void*arg){intloops=*((int*)arg);pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);for(intj=0;j<loops;j++){pthread_mutex_lock(&mutex);pthread_cleanup_push(cleanup_unlock,NULL);glob++;pthread_cleanup_pop(1);// 弹出并执行(正常流程)// 如果被取消,清理函数也会自动执行}pthread_exit(NULL);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1120474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小红书下载神器:XHS-Downloader版本选择终极指南

小红书下载神器&#xff1a;XHS-Downloader版本选择终极指南 【免费下载链接】XHS-Downloader 免费&#xff1b;轻量&#xff1b;开源&#xff0c;基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader XHS…

iOS微信抢红包终极教程:轻松配置智能抢红包助手

iOS微信抢红包终极教程&#xff1a;轻松配置智能抢红包助手 【免费下载链接】WeChatRedEnvelopesHelper iOS版微信抢红包插件,支持后台抢红包 项目地址: https://gitcode.com/gh_mirrors/we/WeChatRedEnvelopesHelper 还在为错过微信群红包而懊恼吗&#xff1f;这款iOS微…

STM32 SysTick定时器Keil实现一文说清

STM32 SysTick定时器Keil实现一文说清 从一个延时问题说起 你有没有遇到过这样的场景&#xff1f;写好了一个LED闪烁程序&#xff0c;烧录进去却发现&#xff1a; 灯闪得忽快忽慢&#xff0c;换了个主频后干脆完全不对了 。 翻来覆去检查代码也没发现问题——循环次数明明是…

基于Dism++精简系统组件提升ms-swift运行效率

基于系统精简与框架优化协同提升AI运行效率 在当前大模型加速向生产环境渗透的背景下&#xff0c;一个常被忽视却至关重要的问题浮出水面&#xff1a;即便拥有强大的训练框架和高端硬件&#xff0c;底层操作系统的“臃肿”仍可能成为性能瓶颈。尤其是在部署如 Qwen3-VL 这类多模…

Joy-Con Toolkit完全指南:5大核心功能实现手柄性能极致优化

Joy-Con Toolkit完全指南&#xff1a;5大核心功能实现手柄性能极致优化 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款专为任天堂Switch手柄设计的开源控制工具&#xff0c;通过强大的自定…

终极指南:如何用SteamAchievementManager轻松掌控游戏成就?

终极指南&#xff1a;如何用SteamAchievementManager轻松掌控游戏成就&#xff1f; 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 还在为那些永远无法达成…

使用Latex编写ms-swift学术研究成果投稿论文

使用 LaTeX 撰写基于 ms-swift 的学术研究成果 在当前大模型与多模态技术迅猛发展的背景下&#xff0c;研究者面临的核心挑战已从“能否训练出一个可用模型”转向“如何高效、可复现地完成从实验到发表的全流程”。尤其是在面对 Qwen3、Llama4、InternVL 等前沿架构时&#xff…

5步搞定Unity游戏翻译:XUnity Auto Translator完整指南

5步搞定Unity游戏翻译&#xff1a;XUnity Auto Translator完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏内容而苦恼吗&#xff1f;XUnity Auto Translator让语言障碍不再是问题&…

PlayCover全面解析:在Mac上构建iOS应用生态圈

PlayCover全面解析&#xff1a;在Mac上构建iOS应用生态圈 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover 还在为Mac平台无法体验丰富的iOS应用生态而遗憾吗&#xff1f;PlayCover为你打开了通往移动应…

iOS微信红包助手完整使用指南:智能自动化抢红包解决方案

iOS微信红包助手完整使用指南&#xff1a;智能自动化抢红包解决方案 【免费下载链接】WeChatRedEnvelopesHelper iOS版微信抢红包插件,支持后台抢红包 项目地址: https://gitcode.com/gh_mirrors/we/WeChatRedEnvelopesHelper 还在为错过微信群里的红包而遗憾吗&#xf…

ms-swift支持弹性伸缩应对突发算力需求高峰

ms-swift&#xff1a;如何用弹性伸缩应对大模型算力“脉冲式”冲击 在电商大促的凌晨三点&#xff0c;客服系统的请求量突然飙升十倍&#xff1b;短视频平台刚上线一个爆款挑战赛&#xff0c;内容审核队列瞬间堆积上万条视频&#xff1b;某政务AI助手在早高峰被市民集中咨询政…

Joy-Con Toolkit终极指南:5个简单步骤完全掌控你的Switch手柄

Joy-Con Toolkit终极指南&#xff1a;5个简单步骤完全掌控你的Switch手柄 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款免费的终极手柄控制工具&#xff0c;专门为任天堂Switch用户设计&…

ms-swift支持LLM解码器独立训练降低计算资源消耗

ms-swift支持LLM解码器独立训练降低计算资源消耗 在大模型落地日益加速的今天&#xff0c;一个现实问题始终困扰着广大开发者&#xff1a;如何用一张消费级显卡&#xff0c;微调一个70亿参数的语言模型&#xff1f;对于多数中小企业和研究团队而言&#xff0c;动辄需要多张A100…

XUnity.AutoTranslator完全攻略:让外语游戏秒变中文版!

XUnity.AutoTranslator完全攻略&#xff1a;让外语游戏秒变中文版&#xff01; 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为心爱的外语游戏而苦恼吗&#xff1f;语言障碍让你无法畅享游戏乐趣&a…

基于FastStone Capture录制ms-swift操作教学视频

基于FastStone Capture录制ms-swift操作教学视频 在大模型技术飞速演进的今天&#xff0c;一个新问题正摆在工程团队面前&#xff1a;模型能力越强&#xff0c;落地门槛反而越高。Qwen3、Llama4这些千亿参数的模型看似触手可及&#xff0c;但真正要在企业环境中完成微调、对齐…

ms-swift支持异步vLLM引擎提升强化学习采样效率

ms-swift 集成异步 vLLM&#xff1a;重塑强化学习采样效率的工程实践 在当前大模型驱动的智能系统开发中&#xff0c;一个看似不起眼却极具破坏力的问题正频繁浮现——推理延迟拖垮训练效率。尤其是在强化学习&#xff08;RL&#xff09;这类依赖高频策略 rollout 的场景下&…

OpenTodoList完整指南:从入门到精通的高效任务管理

OpenTodoList完整指南&#xff1a;从入门到精通的高效任务管理 【免费下载链接】opentodolist A simple Todo and task management application - Mirror of https://gitlab.com/rpdev/opentodolist 项目地址: https://gitcode.com/gh_mirrors/op/opentodolist OpenTodo…

ms-swift支持奖励函数插件机制灵活适配业务需求

ms-swift奖励函数插件机制&#xff1a;灵活适配业务需求的工程实践 在大模型从实验室走向真实场景的过程中&#xff0c;一个核心挑战逐渐浮现&#xff1a;如何让通用模型的行为精准匹配千变万化的业务目标&#xff1f;无论是客服系统需要“礼貌且准确”的回复&#xff0c;还是内…

ncmdumpGUI:网易云音乐NCM格式转换终极指南

ncmdumpGUI&#xff1a;网易云音乐NCM格式转换终极指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 在数字音乐时代&#xff0c;格式兼容性问题常常让音乐爱…

ms-swift支持模型加密保护知识产权不被泄露

ms-swift支持模型加密保护知识产权不被泄露 在大模型快速渗透各行各业的今天&#xff0c;一个70亿参数的语言模型可能凝聚着数百万美元的算力投入和团队智慧。然而&#xff0c;当这样的高价值资产需要交付给客户或部署到边缘环境时&#xff0c;企业最担心的问题往往不是性能&am…