嵌入式学习第二十六天

一.线程的退出

方式一:

1.调用pthread_exit函数

 void pthread_exit(void *retval)
    功能:
         结束调用的线程 
    参数:
       @retval  //退出状态值  //传的是,退出状态值 对应的地址 
      
    注意:
      1.pthread_exit 本身表示结束线程 
        如果用在main函数中 表示结束主线程 
        主线程结束 并不表示进程 
        此时,
        主线程执行流结束,进程会在其余线程都结束后,结束 
        线程推出后要进行资源回收

2.线程的资源回收 
  int pthread_join(pthread_t thread, void **retval);
  功能:
       等待线程结束 
  参数:
     @thread  --- 线程tid  
     @retval  --- 用来保存,退出状态值,所在空间的地址 
     
 返回值:
    成功 0
    失败 错误码 
  注:
     线程退出时,可以带出退出状态值,
     但是传的是,退出状态值对应空间的地址

方式二:

1.通过回调函数(线程执行函数)的返回值

return  + 线程执行函数返回值,效果与pthread_exit()一致

方式三:

发送取消请求

pthread_cancel

int pthread_cancel (pthread_t thread)

thread  是要发送线程的tid号

方式四:

任何一个线程调用了exit,或者主线程(main)return 都会造成进程结束

二.有关线程回收

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

 pthread_detach函数相关:
     pthread_detach(); 
     
    int pthread_detach(pthread_t thread);
    功能:
         分离线程 
    参数:
        thread 要分离的线程的tid
    返回值:
          成功 0
        失败 错误码 
  三.进程与线程之间的优缺点对比

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

2. 各自特点 (优缺点)

 //1.创建 和 调度
  线程 
      创建速度快 
      调度速度快 
      //并发程度 更高 
      
 //2. 安全性 
    线程 【
        好处:
        共享了进程的数据空间 
        共享数据方面 方便 

        缺点:
          安全性不好                   
          带来资源竞争   】             
    
进程 【
        进程空间相互独立 
        好处,
            安全性好 

        缺点:
            进程间共享数据不方便      //进程间通信   (管道,信号,共享内存)

四.线程间的资源竞争

 共享资源:    临界资源
 临界区:    访问共享资源(临界资源)那段代码

解决办法:使用互斥锁

使用过程:定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁

 定义互斥锁:
    pthread_mutex_t   mutex;
    互斥锁类型        互斥锁变量 内核对象 
    
   初始化锁
    pthread_mutex_init(); //初始化一把锁    
    
   
   加锁                      //加锁 加在 要访问临界资源的地方 
       pthread_mutex_lock(); //上锁 
   解锁 
       pthread_mutex_unlock(); //解锁  临界资源访问之后就解开
   销毁
       pthread_mutex_destroy();//销毁一把锁 
    函数原型:

 int pthread_mutex_init(
                     pthread_mutex_t *restrict mutex,
           const pthread_mutexattr_t *restrict attr
                           ); 
    参数:
      @mutex     //就是要初始化的 互斥锁变量 
      @attr      //属性  
                 //NULL 默认属性  --- 普通锁 
                 //读写锁 
                 
                 
       int pthread_mutex_lock(pthread_mutex_t *mutex);
       int pthread_mutex_trylock(pthread_mutex_t *mutex);
       int pthread_mutex_unlock(pthread_mutex_t *mutex);

       参数:
          @mutex    //要操作的那把锁 
        
       int pthread_mutex_destroy(pthread_mutex_t *mutex); //用完之后锁要销毁 

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值