
根据 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 这个概念,也可以把临界区保护起来
1 ysc3839 2019-09-11 11:34:47 +08:00 via Android 后者不停地 unlock 和 lock,开销太大了吧?等于是轮询了。 pthread_cond_wait 等待时应该是不占用 CPU 时间的。 |
2 ipwx 2019-09-11 11:39:54 +08:00 via Android cond wait 有系统维护等待队列。之所以这里用 while 是为了防止多重唤醒吧 |
3 hu8245 2019-09-11 11:42:00 +08:00 via Android 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 的开销太高了 |
4 husinhu 2019-09-11 11:50:55 +08:00 是的你这样就是轮询了,一直在循环并且拿 /释放锁。 第一个 while 目的是保证两个线程的执行顺序。后面就不会轮询了。 |