条件变量

lik*_*eIT 5 synchronization operating-system condition-variable

在操作系统的进程同步中,条件变量的原理是什么?

Ale*_*ler 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 */
Run Code Online (Sandbox Code Playgroud)

这个伪代码样本带有一个bug.如果调度程序决定在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);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • 在更一般的设置中,您想使用`while(state == GOOD)`.条件变量假设有几个线程在相同条件下等待的可能性. (3认同)
  • 这是一个很好的例子,但是如果线程1正在等待状态*不是*GOOD,那么它会不会更清晰一些?按照目前的情况,我没有看到状态目前是好的等待的逻辑,然后当状态变为GOOD时醒来,因为没有状态变化(所以真的没什么可做的)......当然我可能误解了.请有人澄清一下吗? (3认同)
  • @Wad从我所看到的,你是对的,但该网站不允许编辑六个字符以下.如果`state == GOOD`改为`state!= GOOD`,这些例子对我来说很有意义 (3认同)