请教关于 pthread condition 的使用场景

2019-09-11 11:22:16 +08:00
 nthhdy

根据 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 这个概念,也可以把临界区保护起来

3570 次点击
所在节点    Linux
5 条回复
ysc3839
2019-09-11 11:34:47 +08:00
后者不停地 unlock 和 lock,开销太大了吧?等于是轮询了。
pthread_cond_wait 等待时应该是不占用 CPU 时间的。
ipwx
2019-09-11 11:39:54 +08:00
cond wait 有系统维护等待队列。之所以这里用 while 是为了防止多重唤醒吧
hu8245
2019-09-11 11:42:00 +08:00
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 的开销太高了
husinhu
2019-09-11 11:50:55 +08:00
是的你这样就是轮询了,一直在循环并且拿 /释放锁。
第一个 while 目的是保证两个线程的执行顺序。后面就不会轮询了。
nthhdy
2019-09-12 10:34:23 +08:00
感谢各位 @ysc3839 @ipwx @hu8245 @husinhu

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/599948

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX