技术解析

请教关于 pthread condition 的使用场景
0
2021-06-18 21:41:24
idczone

根据 stackoverflow 上这篇贴,condition 的用法可以总结为

// safely examine the condition, prevent other threads from
// altering it
pthread_mutex_lock (&lock);
while ( SOME-CONDITION is false)
    pthread_cond_wait (&cond, &lock);

// Do whatever you need to do when condition becomes true
do_stuff();
pthread_mutex_unlock (&lock);

请问为什么不直接写成这样呢?

while (true) {
    pthread_mutex_lock (&lock);
    if ( SOME-CONDITION is true) {
        do_stuff();
        pthread_mutex_unlock (&lock);
        break;
    } else {
        pthread_mutex_unlock (&lock);
    }
}

这样,不需要 condition 这个概念,也可以把临界区保护起来


后者不停地 unlock 和 lock,开销太大了吧?等于是轮询了。
pthread_cond_wait 等待时应该是不占用 CPU 时间的。

cond wait 有系统维护等待队列。之所以这里用 while 是为了防止多重唤醒吧

pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用 pthread_cond_signal()或 pthread_cond_broadcast 来唤醒它。 pthread_cond_wait() 必须与 pthread_mutex
配套使用。pthread_cond_wait()函数一进入 wait 状态就会自动 release mutex。当其他线程通过 pthread_cond_signal()或 pthread_cond_broadcast,把该线程唤醒,使 pthread_cond_wait()通过(返回)时,该线程又自动获得该 mutex。

---------
也就是说,检测到条件变量不满足,就释放锁,睡眠。等到相关信号唤醒自己,重新加锁,继续执行。一楼说的对,while (true)的 cpu 的开销太高了

是的你这样就是轮询了,一直在循环并且拿 /释放锁。
第一个 while 目的是保证两个线程的执行顺序。后面就不会轮询了。

感谢各位
明白了,问题就在于,我这么写是忙等,平白无故耗 cpu

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服