线程 : 线程安全: 互斥、互斥锁 死锁

线程安全:多个线程对临界资源进行访问而不会对数据造成二义性

 

如何实现线程安全:同步+互斥

        同步:对临界资源访问的时序和理性

        互斥:对临界资源同一时间访问的唯一性

 

如何实现互斥:互斥锁

        

实现线程互斥的五步

1、定义互斥锁变量  

        pthread_mutex_t

 

2、对互斥锁变量初始化

        pthread_mutex_init(mutex, attr)    attr属性变量一般置空NULL

 

3、对临界资源之前,先枷锁  

        pthread_mutex_lock(&mutex),若可以加锁,直接修改计数,函数返回。否则挂机等待【阻塞等待操作】

        pthread_mutex_trylock  如果可以枷锁,直接修改计数器函数返回。否则报错返回【非阻塞等待操作】

        pthread_mutex_timedlock, 如果可以枷锁,直接修改计数器函数返回。否则给定一定时间,如果超时之后,再报错返回【非阻塞等待操作】

 

4、对临界资源操作完毕之后,解锁

        pthread_mutex_unlock(&mutex);

 

5、销毁互斥锁

        pthread_mutex_destroy(&mutex);

 

 

 

死锁:多个线程对锁之源竞争访问,但是因为推进顺序不当,导致相互等待,使得程序无法往下运行‘

        1、互斥条件                     一个锁只有一个线程可以加

        2、不可剥夺条件              我加的锁被人不能解

        3、请求与保持条件           拿着A锁,去请求B锁   但是获取不到B锁,也不释放A锁

        4、环路等待条件               我拿着A锁,对方拿着B锁强求A锁

 

死锁的预防:只能避免的是环路等待。  破话四个必要条件

死锁的避免:

    1、死锁检测算法

    2、银行家算法    调研一下

 

线程间同步的实现:

等待 +唤醒

    操作条件不满足------等待

    别人条件满足 ------唤醒

 

条件变量:

        条件变量实现同步:

            线程在对临界资源访问之前,先判断是否能够操作;若可以操作则线程直接操作;

            否则若不能操作,则条件变量提供等待功能,让pcb等待在队列上

            其他线程促使条件满足,然后唤醒条件变量等待队列上的线程

 

 

实现线程同步的五步:

  1. 定义条件变量 pthread_cond_t

  2. 条件变量初始化 pthread_cond_init(&cond, &attr);

  3. 用户在判断条件不满足的情况下提供等待功能 pthread_cond_wait(&cond, &mutex);

  4. 用户在促使条件满足后,唤醒等待pthread_cond_signal(&cond) 【至少唤醒一个线程】\pthread_cond_broadcast(&cond)【唤醒全部等待的线程】

  5. 销毁条件变量pthread_cond_destroy(&cond)

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值