条件变量[closed]

| 关闭。这个问题需要更加集中。它当前不接受答案。
已邀请:
好吧,条件变量允许您等待某些条件发生。实际上,您的线程可能在条件变量上休眠,而其他线程将其唤醒。 条件变量通常也带有互斥量。这使您可以解决以下同步问题:如何检查互斥保护的数据结构的状态,然后等待其状态更改为其他状态。即
/* 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);
希望能帮助到你。

要回复问题请先登录注册