【无标题】

发布于:2024-08-19 ⋅ 阅读:(89) ⋅ 点赞:(0)

退出线程

1,pthread_exit

2,从线程执行函数中用return;//效果等价于phread_exit

3,函数 phread_cancel  给线程发送取消请求

int pthread_cancel(pthread_t thread)    参数为要发送线程的tid    成功返回0,失败返回错误码

线程属于异常退出,无法获得退出状态信息

4,任何一个线程中调用函数exit(),或者在主线程中执行了return,会造成进程结束,使所有线程结束

线程资源回收

(1)pthread_join //需要自己回收,一般是子线程在短时间内运行完

(2)pthread_detach //可分离属性   , 子线程运行很久才结束,一般在线程创建好后设置分离状态,不关心线程退出状态

函数  pthread_detach  分离一个线程

int pthread_detach(pthread_tthread)参数tid

系统自动回收,什么时候回收不确定,取决于操作系统调度

线程    创建调度速度快,并发程度高,共享进程的数据空间,共享数据方便,但安全性低,会带来资源竞争

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

机制:
    互斥锁   
    互斥     排他性  同一时间只有一个线程访问 --- 要么不访问 要访问就是一次完整操作  (原子操作)
锁是一种线程间同步机制能有序访问

锁的操作机制 
      定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁

(1)定义互斥锁      (在全局定义)

   pthread_mutex_t   mutex;

 互斥锁类型        互斥锁变量 内核对象 
(2)初始化          (在主函数创建线程之前)

 函数pthread_mutex_init();

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

(3)加锁                      //加锁 加在 要访问临界资源的地方 
       pthread_mutex_lock(); //上锁 

int pthread_mutex_lock(pthread_mutex_t *mutex);
(4) 解锁 
       pthread_mutex_unlock(); //解锁  临界资源访问之后就解开

 int pthread_mutex_unlock(pthread_mutex_t *mutex);
  (5) 销毁
       pthread_mutex_destroy();//销毁一把锁 

int pthread_mutex_destroy(pthread_mutex_t *mutex); //用完之后锁要销毁         
          
静态初始化 ,定义的同时并初始化  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


网站公告

今日签到

点亮在社区的每一天
去签到