条件变量与操作系统进程同步的原理是什么?
答案 0 :(得分:14)
好吧,条件变量允许您等待某些条件发生。在实践中,你的线程可能会睡在条件变量上,而其他线程会将其唤醒。
条件变量通常也带有互斥锁。这允许您解决以下同步问题:如何检查某些互斥锁保护数据结构的状态,然后等待状态更改为其他状态。即。
/* in thread 1 */
pthread_mutex_lock(mx); /* protecting state access */
while (state != GOOD) {
pthread_mutex_unlock(mx);
wait_for_event();
pthread_mutex_lock(mx);
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx); /* protecting state access */
state = GOOD;
pthread_mutex_unlock(mx);
signal_event(); /* expecting to wake thread 1 up */
此伪代码示例带有错误。如果调度程序决定在pthread_mutex_unlock(mx)之后但在wait_for_event()之前将上下文从线程1切换到线程2,会发生什么。在这种情况下,线程2不会唤醒线程1,线程1将继续睡眠,可能永远。
条件变量通过在睡眠前原子地解锁互斥锁并在唤醒后原子锁定它来解决此问题。有效的代码如下所示:
/* in thread 1 */
pthread_mutex_lock(mx); /* protecting state access */
while (state != GOOD) {
pthread_cond_wait(cond, mx); /* unlocks the mutex and sleeps, then locks it back */
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx); /* protecting state access */
state = GOOD;
pthread_cond_signal(cond); /* expecting to wake thread 1 up */
pthread_mutex_unlock(mx);
希望它有所帮助。