Unix——线程

1.pthread_exit 
void pthread_exit(void *retval);
功能:
    结束线程 
参数:
   retval --- 带出的值的 地址 
 
注意:
  1. pthread_exit //带出的是 保存了 退出状态值  的空间的地址
                //退出状态值 不能放在栈上 
  2. pthread_exit //主线程调用的时候,此时不会结束进程,只是结束了主线的执行流
                  //这种情况,进程会在所有线程执行完之后才结束  .

prhread_exit结束线程(等待所用线程执行完)

int pthread_join(pthread_t thread, void **retval);

2.pthread_cancel
int pthread_cancel(pthread_t thread) 
功能:
    取消线程 
参数:
  thread --- 要取消的线程的tid 
返回值 
   成功 0 
   失败 错误码 
   
注意:
  1. 线程间 的地位是平等的 可以 相互取消 

2.在子线程中同样可以取消主线程

3.总结

 线程:
    【1】.线程 --- 轻量级的进程 
    【2】线程组成 
      线程tid 
      程序计数器 
      其它寄存器 
      栈 
    【3】创建线程 
      pthread_create 
         tid 
         属性 -- 可结合 可分离 ---决定最终资源的回收方式  
         线程执行函数 --- 这是体现线程任务的部分 
         arg  -- 传给线程执行函数的参数 
   【4】线程退出 
     a.pthread_exit 
     b.return ---线程执行函数中 
     c.pthread_cancel 
     d.exit 
   
   【5】.线程退出状态值 
     pthread_join 


4.线程的属性的设置:
1. pthread_detach  //将指定的线程设置为分离状态 --- 那么资源的回收将自动完成


2. pthread_attr_setdetachstate   

   int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
   功能:
       设置线程的属性 
   参数:
       @attr --- 属性的对象 (变量)
       @detachstate --- 要设置的属性 
            PTHREAD_CREATE_DETACHED  //分离
             PTHREAD_CREATE_JOINABLE //结合 
  返回值
     成功 0
     失败 errno 
    【1】.初始化 一个 属性的对象 
      int pthread_attr_init(pthread_attr_t *attr);
 
     【2】设置属性信息      
      int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
     【3】销毁      
     int pthread_attr_destroy(pthread_attr_t *attr);
     


5.pthread_cleanup
void pthread_cleanup_push(void (*routine)(void *), void *arg);

    功能:注册一个线程清理函数
    参数,routine,线程清理函数的入口
          arg,清理函数的参数。
    返回值,无
        
void pthread_cleanup_pop(int execute);
    功能:调用清理函数
    execute,
            非0  执行清理函数
            0 ,不执行清理            
    返回值,无
    
注意:
   1.     使用时 pthread_cleanup_push  pthread_cleanup_pop 要一起用 ,需要在一个代码块 


 
    
触发方式:
   1.pthread_cleanup_pop(非零值)
   2.pthread_cleanup_pop(0) //pthread_exit() //退出动作会导致 触发 
    pthread_exit(NULL);
    pthread_cleanup_pop(0); 
    
   3.pthread_cancel(); //被其它线程结束时 


6.线程 对比 进程 

进程 
   优点
      进程空间独立 --- 更稳定 安全 可靠      
   缺点
      进程创建,调度效率低
      数据共享不方便 ---- 进程间通信
    
线程 
   优点
     创建,调度效率高 
     共享数据方便 
   缺点
      共享进程空间和资源 
      ---不稳定,不安全 
      共享数据 ---资源的竞争 

 
   7.互斥和原子性操作的概念

   【1】互斥操作  :  
   互斥 --- 排他性 
    
   【2】原子性操作 --- 不可再分的操作 
    临界资源: 共享资源 
    临界区  : 一段代码区域(访问临界资源的那段代码)
    原子操作: 要么不操作,要操作,一定是一次完整的操作。不能被打断。
    概念:
    互斥 ===》在多线程中对临界资源的排他性访问。
     互斥机制 ===》互斥锁  ===》保证临界资源的访问控制。

    8.pthread_mutex_t   mutex;
    互斥锁类型        互斥锁变量 内核对象

    框架:
       定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁
        ****                       ***      *** 

     【1】定义:
        pthread_mutex_t   mutex;

     【2】初始化锁
        int pthread_mutex_init(
            pthread_mutex_t *mutex,
            const pthread_mutexattr_t *attr);
        功能:将已经定义好的互斥锁初始化。
        参数:mutex 要初始化的互斥锁
              atrr  初始化的值,
              一般是NULL表示默认锁   //一般的锁 ,读写锁 
        返回值:成功 0
                失败 非零
        pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //静态初始化 
     【3】加锁:
        int pthread_mutex_lock(pthread_mutex_t *mutex);
        功能:用指定的互斥锁开始加锁代码
              加锁后的代码到解锁部分的代码属于原子操作,
              在加锁期间其他进程/线程都不能操作该部分代码
              如果该函数在执行的时候,mutex已经被其他部分
              使用则代码阻塞。

        参数: mutex 用来给代码加锁的互斥锁
        返回值:成功 0
                失败 非零

     【4】、解锁
        int pthread_mutex_unlock(pthread_mutex_t *mutex);
        功能:将指定的互斥锁解锁。
              解锁之后代码不再排他访问,一般加锁解锁同时出现。
        参数:用来解锁的互斥锁
        返回值:成功 0
                失败 非零

     【5】销毁
         int pthread_mutex_destroy(pthread_mutex_t *mutex);
         功能:使用互斥锁完毕后需要销毁互斥锁
         参数:mutex 要销毁的互斥锁
         返回值:成功  0
                 失败  非零
 
注意:
   原则 --- 锁的区域 尽可能小 


   

     


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值