关于条件变量pthread_cond_wait的互斥锁

之前在网上看到很多资料都说条件变量的互斥锁是用来保护条件变量的,没用之前觉得挺有道理的。后来自己真正用的时候,才发现并不是那么回事。例如下面的例子:

pthread_mutex_t cmutex;

pthread_cond_t cond;

pthread_mutex_init(&cmutex, NULL);

pthread_cond_init(&cond, NULL);

pthread_mutex_lock(&cmutex)

while(flage == false){

    pthread_cond_wait(&cond, &cmutex);

}

pthread_mutex_unlock(&cmutex);

加锁等待条件变量

pthread_mutex_lock(&cmutex)

    flage = true;

    pthread_cond_signal(&cond);

pthread_mutex_unlock(&cmutex);

加锁通知条件变量

上述程序中,如果加锁是为了保护条件变量,那么将会产生死锁。因为pthread_cond_wait(&cond, &cmutex)获得了互斥锁,一直在阻塞等待条件变量的信息,自然pthread_cond_signal(&cond)部分是获得不了互斥锁的,所以会产生死锁。

上述只是给大家举个例子,实际上该互斥锁是为了保护flage变量的。当我们在用pthread_cond_wait(&cond, &cmutex);等待条件变量通知时,容易产生虚假唤醒,这样会导致运行结果不正确。所以我们往往在外层加一个循环和变量来判断,是不是虚假唤醒(例如不是虚假唤醒就置flage为true)。pthread_cond_wait(&cond, &cmutex)是三步组成。真实实现如下:

pthread_mutex_lock(&cmutex)

while(flage == false){

    pthread_cond_wait(&cond, &cmutex);=

    {1、pthread_mutex_unlock(&cmutex);

    2、 pthread_cond_wait();等待唤醒,唤醒后再加锁,这样通知条件变量的语句才有机会加锁

    3、pthread_mutex_lock(&cmutex);

    }

}

pthread_mutex_unlock(&cmutex);

上述分解后的步骤可以看到,整个过程都是在保护flage变量的,设计的也很巧妙。

第一篇博客,写的可能不是很清楚,谅解。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值