pthread_mutex_t 和 pthread_cond_t

有个大神写得非常好,我复述一下(哎,我只适合当一个复读机,希望我等下能提出一些自己的见解)
假设有两个线程同时访问一个全局变量n,这个变量的初始值为0,即int n = 0;
规则:
当消费者线程a进入临界区访问n,a必须要等到n > 0才会继续向下执行至离开临界区,如果n == 0,那么a将会在当前阻塞
当生成者线程b进入临界区访问n时,b将会修改n的值,使得n > 0,然后线程b将会唤醒处于阻塞态的消费者线程a,a被唤醒后将会继续往下执行
显然,这存在死锁的情况,因为当消费者线程a访问临界区n,如果n == 0,那么a将会停留在临界区,生产者线程因此也就无法进入临界区,n的值也就无法被修改,死锁出现
解决这一问题的办法就是采用条件变量
消费者在无法继续往下执行的时候,依然没有是否锁,也依然没有离开临界区,所以我们从这里下手
消费者进入临界区访问 > 发现临界资源不满足继续往下执行的条件 > 消费释放锁离开临界区同时等待在条件变量上(就是消费者线程依然会处于阻塞态,但是不是在临界区中阻塞)消费者线程执行pthread_cond_wait(&condition, *mutex) > 生产者线程拿到锁,进入临界区,修改共享资源(生产),生产者线程通过执行pthread_cond_signal 函数来唤醒消费者线程,同时生产者线程释放锁 > 消费者线程获得锁,访问临界区,释放锁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值