条件变量的虚假唤醒

使用方式:

pthread_mutex_lock(&g_threadinfo.mutex);	//配合互斥锁使用

while (g_threadinfo.tasknum <= 0)
{
    //如果获得了互斥锁,但是条件不合适的话,wait会释放锁,不往下执行。
    //当变化后,条件合适,将直接获得锁。
    pthread_cond_wait(&g_threadinfo.cond, &g_threadinfo.mutex);

    if (!g_threadinfo.thread_running)
        break;

}// end inner-while-loop

current = ctrip_thread_pool_retrieve_task();

pthread_mutex_unlock(&g_threadinfo.mutex);

必须要把pthread_cond_wait()放在while里

假设pthread_cond_wait不放在这个while循环里面,正常情况下,pthread_cond_wait因为条件不满足,挂起线程。
然后,当外部条件满足以后,其他线程调用pthread_cond_signal或pthread_cond_broadcast来唤醒挂起的线程。
但是条件变量可能在某些情况下也被唤醒,这个时候pthread_cond_wait处继续往下执行,但是这个时候,条件并不满足(比如任务队列中仍然为空)。这种唤醒我们叫“虚假唤醒”。
为了避免虚假唤醒时,做无意义的动作,我们将pthread_cond_wait放到while循环条件中,这样即使被虚假唤醒了,由于while条件(比如任务队列是否为空,资源数量是否大于0)仍然为true,导致线程进行继续挂起。

为什么在某些情况下会被唤醒?
futex调用:宁愿多发信号,也要避免不发信号导致信号丢失。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值