当前位置: 首页 > news >正文

【项目 线程2】3.5 线程的分离 3.6线程取消 3.7线程属性

3.5 线程的分离

在这里插入图片描述

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>void * callback(void * arg) {printf("chid thread id : %ld\n", pthread_self());return NULL;
}int main() {// 创建一个子线程pthread_t tid;//可以通过循环创建多个线程int ret = pthread_create(&tid, NULL, callback, NULL);if(ret != 0) {char * errstr = strerror(ret);printf("error1 : %s\n", errstr);}// 输出主线程和子线程的idprintf("tid : %ld, main thread id : %ld\n", tid, pthread_self());// 设置子线程分离,子线程分离后,子线程结束时对应的资源就不需要主线程释放ret = pthread_detach(tid);if(ret != 0) {char * errstr = strerror(ret);printf("error2 : %s\n", errstr);}// 设置分离后,对分离的子线程进行连接 pthread_join()会报错// ret = pthread_join(tid, NULL);// if(ret != 0) {//     char * errstr = strerror(ret);//     printf("error3 : %s\n", errstr);// }pthread_exit(NULL);return 0;
}

在这里插入图片描述
若设置分离后,对分离的子线程进行连接 pthread_join()会出现报错如下:
在这里插入图片描述

3.6线程取消

核心在于:取消线程后,不会立马终止该线程
在这里插入图片描述

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>void * callback(void * arg) {printf("chid thread id : %ld\n", pthread_self());for(int i = 0; i < 5; i++) {//  sleep(1);printf("child : %d\n", i);}return NULL;
}int main() {// 创建一个子线程pthread_t tid;int ret = pthread_create(&tid, NULL, callback, NULL);if(ret != 0) {char * errstr = strerror(ret);printf("error1 : %s\n", errstr);}// 取消子线程,并非立马取消,而是遇到取消点(系统调用)才取消pthread_cancel(tid);for(int i = 0; i < 5; i++) {printf("%d\n", i);}// 输出主线程和子线程的idprintf("tid : %ld, main thread id : %ld\n", tid, pthread_self());pthread_exit(NULL);return 0;
}

在这里插入图片描述

3.7线程属性(pthread_attr_t)

在这里插入图片描述在这里插入图片描述命令查看线程属性pthread_attr_ 的相关函数:man pthread_attr_ 不要回车 按两次tab

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>void * callback(void * arg) {printf("chid thread id : %ld\n", pthread_self());return NULL;
}//通过线程属性设置线程分离
int main() {// 创建一个线程属性变量pthread_attr_t attr;// 初始化属性变量pthread_attr_init(&attr);// 设置属性(设置线程分离属性),要分离,但子线程结束后自己可以释放资源,不需要其他线程回收释放子线程的资源//默认是不分离:PTHREAD_CREATE_JOINABLE,可加入的pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);// 创建一个子线程pthread_t tid;int ret = pthread_create(&tid, &attr, callback, NULL);if(ret != 0) {char * errstr = strerror(ret);printf("error1 : %s\n", errstr);}// 获取线程的栈的大小size_t size;pthread_attr_getstacksize(&attr, &size);printf("thread stack size : %ld\n", size);// 输出主线程和子线程的idprintf("tid : %ld, main thread id : %ld\n", tid, pthread_self());// 释放线程属性资源pthread_attr_destroy(&attr);pthread_exit(NULL);return 0;
}

显示结果
默认分配线程栈的大小为8388608

在这里插入图片描述

http://www.lryc.cn/news/109613.html

相关文章:

  • Filebeat+ELK 部署
  • el-table点击表格某一行添加到URL参数,访问带参URL加载表格内容并滚动到选中行位置 [Vue3] [Element-plus 2.3]
  • 【树】 二叉树 堆与堆排序 平衡(AVL)树 红黑(RB)树
  • 信号平滑或移动平均滤波研究(Matlab代码实现)
  • 黑客技术(网络安全)自学
  • 使用七牛云、阿里云、腾讯云的对象存储上传文件
  • 使用阿里云DataX完成数据同步
  • 《Kali渗透基础》13. 无线渗透(三)
  • python——案例六:判断字符串的长度
  • PC-windows-安卓-Linux音频系统框架概论
  • Web Worker API
  • 1.4 MA多头/空头排列是真的吗?
  • 基于SpringBoot+Vue的CSGO赛事管理系统设计与实现(源码+LW+部署文档等)
  • Android系统APP之SettingsProvider
  • go入门实践二-tcp服务端
  • SprinMVC获取请求参数
  • orangepi 4lts ubuntu安装RabbitMQ
  • SolidWorks 3D Interconnect介绍
  • MBG中update语句的区别
  • 论文阅读 - Few-shot Network Anomaly Detection via Cross-network Meta-learning
  • 秋招算法备战第37天 | 738.单调递增的数字、968.监控二叉树、贪心算法总结
  • Windows server上用nginx部署vue3项目
  • 计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D
  • 【FAQ】EasyGBS平台通道显示在线,视频无法播放并报错400的排查
  • G1和CMS
  • 详解Linux中的socket函数
  • React Antd 实现表格合计功能
  • 尝试一下Guava带返回值的多线程处理类ListenableFuture
  • 微信小程序真机调试报ERR_CERT_AUTHORITY_INVALID
  • JCommander + AutoService打造带子命令的Java命令行应用