条件变量和互斥锁的配合使用

1.条件变量的作用

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。

2.互斥锁的作用

互斥锁用来保护代码临界区,从而保证任何时刻只有一个线程在临界区内执行。(防止多个线程或多个进程对内容进行同时读写)

3.配合使用

保证在任何时候都只有一个线程在等待条件满足,并且当条件满足后等待的线程会收到通知,而不必轮寻,同时释放锁。
条件变量就是减少竞争,在条件满足后就去唤醒等待的线程

4.相关函数

  1. 初始化条件变量
    int pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);
    第一个参数是一个pthread_cond_t类型的条件变量,第二个参数直接设置NULL
    初始化成功返回0

  2. 阻塞在条件变量上
    int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex);
    函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。
    函数返回时互斥锁将被锁定,但并不代表着条件发生了变化,需要重新检查条件变量的值
    执行成功返回0
    3.唤醒
    int pthread_cond_signal(pthread_cond_t *cond);
    最多只会给一个线程发送信号唤醒

5.逻辑分析

我要对一块共享数据操作,但是我怕同时你也操作,那就乱套了,所以我要加锁,这个时候我就开始操作这块共享数据,而你进不了临界区,等我操作完了,把锁丢掉,你就可以拿到锁进去操作了。我拿个锁,进了临界区,看到了共享数据,发现,条件还不到,于是我就调用 pthread_cond_wait(),先把锁丢了,好让别人可以去对共享数据做操作,然后呢?然后我就睡了,直到特定的条件发生,别人修改完了共享数据,给我发了个消息,我又重新拿到了锁,继续要干的事

6.条件变量和信号量的区别

使用条件变量可以一次唤醒所有等待者,而这个信号量没有的功能
条件变量类似事件机制,当条件满足的时候会通知等待中的线程;而信号量没有这种通知机制

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值