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

学习记录第二十八天

线程结束方式

1.pthread_cancel

函数定义结构:

#include <pthread.h> 
int pthread_cancel(pthread_t thread);

参数:

thread:类型为pthread_t,表示要取消的线程的标识符。
返回值:

成功时返回0。
失败时返回错误码,可能的错误码包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。


2.pthread_detach

函数定义结构:

#include <pthread.h> 
int pthread_detach(pthread_t thread);
参数:

thread:类型为pthread_t,表示要设置为分离状态的线程的标识符。
返回值:

成功时返回0。
失败时返回错误码,可能的错误码同样包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。

线程的资源回收

 1.pthread_join    //需要自己回收  ---线程的属性 (可结合性)  --- 一般是子线程 在较短时间内运行完 
 2.pthread_detach  //可分离属性    ---子线程运行很久才结束 ---  设置分离属性 

线程的资源回收与线程的属性(可结合或分离)密切相关:

  • 可结合(joinable)线程:默认情况下,线程是可结合的。这意味着线程在结束时不会自动释放其资源,而是需要由其他线程(通常是主线程)通过调用pthread_join函数来显式地结束并回收其资源。pthread_join函数会阻塞调用它的线程,直到指定的线程结束,并回收该线程的资源。
  • 分离(detached)线程:分离线程在结束时会自动释放其资源,而不需要其他线程来调用pthread_join。可以通过在创建线程时设置线程属性为PTHREAD_CREATE_DETACHED,或者在线程内部调用pthread_detach(pthread_self())来将线程设置为分离状态。设置为分离的线程不能再次被pthread_join,尝试这样做将返回错误。
  • 资源回收
  •        可结合性 --- pthread_join    //这种用于 ,线程任务较短,主线程需要关心子线程状态 
  •        可分离性 --- pthread_detach  //子程序执行任务较长,主线程也不需要关心子线程状态

对比 线程 和 进程 

1.线程 vs 进程 
线程 CPU执行的最小单位 
进程 资源分配和任务调度基本单位 

2. 各自特点 (优缺点)

 //1.创建 和 调度
  线程 
      创建速度快 
      调度速度快 
      
      //并发程度 更高 
      
 //2. 安全性 
    
    线程 
        好处:
        共享了进程的数据空间 
        共享数据方面 方便 
        缺点:
          安全性不好                   //
          带来资源竞争                //专门的技术 解决资源竞争  --- 互斥 同步 
    进程 
        进程空间相互独立 
        好处,
            安全性好 
        缺点:
            进程间共享数据不方便      //进程间通信   (管道,信号,共享内存)

线程间的资源竞争:
   共享资源:    临界资源
   临界区  :    访问共享资源(临界资源)那段代码 

互斥锁相关函数

互斥锁   
    互斥     排他性   --- 要么不访问 要访问就是一次完整操作 
    框架:
     定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁


初始化互斥锁


int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);


mutex:指向互斥锁变量的指针。
attr:指向互斥锁属性的指针,如果为NULL,则使用默认属性。


销毁互斥锁


int pthread_mutex_destroy(pthread_mutex_t *mutex);


mutex:指向需要销毁的互斥锁变量的指针。


锁定互斥锁


int pthread_mutex_lock(pthread_mutex_t *mutex);


mutex:指向需要锁定的互斥锁变量的指针。
 

解锁互斥锁


int pthread_mutex_unlock(pthread_mutex_t *mutex);


mutex:指向需要解锁的互斥锁变量的指针。


尝试锁定互斥锁


 
    int pthread_mutex_trylock(pthread_mutex_t *mutex);


mutex:指向需要尝试锁定的互斥锁变量的指针。
如果互斥锁已被其他线程锁定,pthread_mutex_trylock会立即返回EBUSY错误,而不是阻塞当前线程。


使用注意事项


死锁:在使用互斥锁时,要特别注意避免死锁的情况,即两个或多个线程互相等待对方释放锁。

锁的顺序:在多个锁的场景下,需要保证所有线程都以相同的顺序获取锁,以避免死锁。

性能影响:虽然互斥锁能有效保护共享资源,但它们也可能成为性能瓶颈。过度使用锁或在锁的临界区内执行过多操作都会降低程序的性能。

递归锁:POSIX线程库还支持递归锁(recursive mutex),允许同一个线程多次锁定同一个互斥锁。但在使用时需要谨慎,因为不当的使用仍然可能导致死锁或资源耗尽。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 中国软件评测中心:2024年最新人工智能大语言模型技术发展研究报告 (附文档)
  • SQL— DDL语句学习【后端 10】
  • 单一职责原则入门:如何编写更清晰、更可维护的代码
  • 【网络】套接字(socket)编程——TCP版
  • 机械学习—零基础学习日志(如何理解线性代数3)
  • Python学习第二课(变量)
  • 推荐浏览器爬虫插件:Instant Data Scraper 无需写一行代码
  • 前端 JS 经典:防抖和节流函数
  • 【计算机网络】CIDR无分类编址知识学习
  • 【机器学习】ImageNet的基本概念以及如何使用ImageNet数据集
  • 商品期权会爆仓吗?
  • java-activiti笔记
  • OceanBase V4.2特性解析:简化分区表重命名功能
  • 0101中文乱码-BufferedImage-图片处理
  • 搭载海光3350处理器的高速流量处理模块(用于高速网络数据处理设备应用)
  • (三)从jvm层面了解线程的启动和停止
  • css属性的继承、初识值、计算值、当前值、应用值
  • laravel5.5 视图共享数据
  • php ci框架整合银盛支付
  • PHP面试之三:MySQL数据库
  • React中的“虫洞”——Context
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 工作中总结前端开发流程--vue项目
  • 观察者模式实现非直接耦合
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 正则与JS中的正则
  • # SpringBoot 如何让指定的Bean先加载
  • (javascript)再说document.body.scrollTop的使用问题
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (SpringBoot)第七章:SpringBoot日志文件
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)丶RabbitMQ的六大核心
  • (分布式缓存)Redis哨兵
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)大型网站架构演变和知识体系
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net和jar包windows服务部署
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [Bugku] web-CTF靶场系列系列详解⑥!!!
  • [BZOJ3757] 苹果树
  • [C/C++]数据结构 栈和队列()
  • [c++] C++多态(虚函数和虚继承)
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [CocosCreator]Android的增加AndroidX的动态权限
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [Django 0-1] Core.Email 模块
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
  • [JS] 常用正则表达式集(一)
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!
  • [leetcode hot 150]第二十三题,合并K个升序链表