【Linux系统编程】30.pthread_exit、pthread_join、pthread_cancel

目录

pthread_exit

参数retval

测试代码1

测试结果

pthread_join

参数thread

参数retvsl

返回值

测试代码2

测试结果

pthread_cancel

参数thread

返回值

测试代码3

测试结果

pthread_exit

退出当前线程。

man 3 pthread_exit

参数retval

退出值。

NULL:无退出值。

测试代码1

退出某一个线程。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>void *HuiDiao_HanShu(void *arg)
{int num;num = (int)arg + 1;sleep(num);if (num == 3) //退出第3个子线程{pthread_exit(NULL);}printf("这是第%d个子线程的回调函数,子线程的进程ID是%d,子线程ID是%lu。\n", num, getpid(), pthread_self());
}int main(int argc, char *argv[])
{int flag, i;pthread_t ZiXianCheng_ID; //子线程IDfor (i = 0; i < 5; i++){flag = pthread_create(&ZiXianCheng_ID, NULL, HuiDiao_HanShu, (void *)i); //创建子线程if (flag != 0){perror("创建子线程错误");exit(1);}}printf("这是主线程,进程ID是%d,线程ID是%lu。\n", getpid(), pthread_self());sleep(i + 1);return 0;
}

测试结果

pthread_join

阻塞等待线程退出,获取线程退出状态。

man 3 pthread_join

参数thread

线程ID。

参数retvsl

存储线程结束状态。被杀死的线程:-1

返回值

成功:0

失败:错误号

测试代码2

阻塞等待线程退出。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>struct CeShi
{int a;char str[256];
};void *HuiDiao_HanShu(void *arg)
{struct CeShi *temp;temp = malloc(sizeof(temp));temp->a = 100;strcpy(temp->str, "你好,世界!\n");printf("这是子线程的回调函数,子线程的进程ID是%d,子线程ID是%lu。\n", getpid(), pthread_self());return (void *)temp;
}int main(int argc, char *argv[])
{int flag;pthread_t ZiXianCheng_ID; //子线程IDstruct CeShi *temp1;flag = pthread_create(&ZiXianCheng_ID, NULL, HuiDiao_HanShu, NULL); //创建子线程if (flag != 0){perror("创建子线程错误");exit(1);}printf("这是主线程,进程ID是%d,线程ID是%lu。\n", getpid(), pthread_self());printf("开始回收子线程!\n");flag = pthread_join(ZiXianCheng_ID, (void **)&temp1);if (flag != 0){perror("回收子线程错误");exit(1);}printf("回收子线程完成!\n");printf("a=%d,str=%s", temp1->a, temp1->str);pthread_exit(NULL);return 0;
}

测试结果

pthread_cancel

杀死一个线程,需要取消点或者系统调用才能完全杀死

man 3 pthread_cancel

参数thread

待杀死线程的ID。

返回值

成功:0,确认执行线程的死刑,具体执行时间未知

失败:错误号

测试代码3

杀死一个线程。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>void *HuiDiao_HanShu(void *arg)
{printf("这是子线程的回调函数,子线程的进程ID是%d,子线程ID是%lu。\n", getpid(), pthread_self());while (1){//printf("这是子线程的回调函数,子线程的进程ID是%d,子线程ID是%lu。\n", getpid(), pthread_self());//sleep(1);pthread_testcancel(); //设置取消点}return (void *)0;
}int main(int argc, char *argv[])
{int flag;pthread_t ZiXianCheng_ID; //子线程IDvoid *num = NULL;flag = pthread_create(&ZiXianCheng_ID, NULL, HuiDiao_HanShu, NULL); //创建子线程if (flag != 0){perror("创建子线程错误");exit(1);}printf("这是主线程,进程ID是%d,线程ID是%lu。\n", getpid(), pthread_self());printf("这是主线程,先睡一会,再杀子线程!\n");sleep(3);printf("这是主线程,睡醒了!\n");printf("开始杀子线程!\n");flag = pthread_cancel(ZiXianCheng_ID);if (flag != 0){perror("杀子线程错误");exit(1);}printf("子线程已杀死!\n");printf("开始回收子线程!\n");flag = pthread_join(ZiXianCheng_ID, &num);if (flag != 0){perror("回收子线程错误");exit(1);}printf("回收子线程完成!\n");printf("num=%d\n", (int)num);pthread_exit(NULL);return 0;
}

测试结果

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

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

相关文章

JAVA面试专题-Redis

你在最近的项目中哪些场景使用了Redis 缓存 缓存穿透 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不好直接写入缓存&#xff0c;导致每次请求都查数据库。 解决方案一&#xff1a;缓存空数据&#xff0c;即使查询返回的数据为空&#xff0c;也把…

学习 Rust 第 23 天:闭包

Rust 闭包提供了简洁、富有表现力的匿名函数来捕获周围的变量。它们简化了代码&#xff0c;提供了存储、参数传递和函数重构方面的灵活性。它们与泛型的交互增强了灵活性&#xff0c;而捕获模式则促进了有效的所有权和可变性管理。从本质上讲&#xff0c;闭包是 Rust 的基础&am…

(7)快速调优

文章目录 前言 1 安装脚本 2 运行 QuikTune 3 高级配置 前言 VTOL QuikTune Lua 脚本简化了为多旋翼飞行器的姿态控制参数寻找最佳调整的过程。 脚本会缓慢增加相关增益&#xff0c;直到检测到振荡。然后&#xff0c;它将增益降低 60%&#xff0c;并进入下一个增益。所有增…

24五一杯B题思路分享+分析问题

回顾问题 ### 问题1&#xff1a;小型交通网络的交通需求分配 1. **理解问题**&#xff1a;首先&#xff0c;需要理解交通网络的结构和各起点-终点对之间的交通需求。 2. **建立模型**&#xff1a;使用线性规划、动态规划或启发式算法来分配交通量到不同的路径上。 3. **优化目…

汽车制造业安全事故频发,如何才能安全进行设计图纸文件外发?

汽车制造业产业链长&#xff0c;关联度高&#xff0c;汽车制造上游行业主要为钢铁、化工等行业&#xff0c;下游主要为个人消 费、基建、客运和军事等。在汽车制造的整个生命周期中&#xff0c;企业与上下游供应商、合作商之间有频繁、密切的数据交换&#xff0c;企业需要将设计…

windows11安装nginx

1.解压nginx安装包到没有中文的目录 2.双击运行nginx.exe 3.任务管理器查看是否有nginx进程 4.任务管理器->性能->资源监视器 5.网络->侦听端口&#xff0c;查看nginx侦听的端口&#xff0c;这里是90端口

吴恩达2022机器学习专项课程(一)7.2 逻辑回归的简化成本函数课后实验 Lab5

问题预览/关键词 二分类问题的训练集&#xff08;多特征&#xff09;绘制训练集数据的散点图自定义plot_data() Python实现逻辑回归的成本函数自定义sigmoid() 调用成本函数不同的w&#xff0c;b&#xff0c;绘制逻辑回归模型的决策边界验证哪条决策边界效果好总结 二分类问题的…

对话访谈——五问RAG与搜索引擎:探索知识检索的未来

记一次关于RAG和搜索引擎在知识检索方面的对话访谈&#xff0c;针对 RAG 与传统搜索引擎的异同,以及它们在知识检索领域的优劣势进行了深入的探讨。 Q&#xff1a;传统搜索引擎吗&#xff0c;通过召回-排序的两阶段模式&#xff0c;实现搜索逻辑的实现&#xff0c;当前RAG技术也…

Jetson Orin NX L4T35.5.0平台LT6911芯片 调试记录(2)vi discarding frame问题调试

基于上篇调试记录 Jetson Orin NX L4T35.5.0平台LT6911芯片 调试记录(1)MIPI问题调试-CSDN博客 1.前言 当通过gstreamer持续捕获视频设备时,帧数会下降,并且I输入越高,丢失的帧数越多。 当达到4k30hz时,它完全无法使用,系统会在几秒钟的收集后崩溃并重新启动 4k30hz …

Mac 版 安装NVM

优质博文IT-BLOG-CN NVM&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具。它允许开发者在同一台机器上安装和切换不同版本的Node.js&#xff0c;以便在不同的项目中使用不同的Node.js版本。macOS用户可以使用homebrew来安装NVM。 一、安装h…

VS code 同步odata服务

在做UI5得开发过程中&#xff0c;经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存

DevEco Studio mac版启动不了【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【DevEco Studio mac版启动不了】的问题。 问题描述 报错如下。 -------…