【问题标题】:condition variable [closed]条件变量[关闭]
【发布时间】:2011-08-08 15:43:57
【问题描述】:

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

【问题讨论】:

  • 如果您用 2-3 句话解释您理解的内容和未理解的内容,可能会有所帮助。这将使某人更容易(也更有可能)给你一个有用的答案。诸如“请解释 X”之类的过于笼统的问题并不像“我不明白这个……关于 X”或“为什么 X 做 Y,而不是 Z”这样的问题得到好的答案。 .

标签: synchronization operating-system condition-variable


【解决方案1】:

嗯,条件变量允许您等待特定条件发生。在实践中,您的线程可能会在条件变量上休眠,而其他线程会将其唤醒。

条件变量通常也带有互斥锁。这使您可以解决以下同步问题:如何检查某些受互斥锁保护的数据结构的状态,然后等到它的状态更改为其他状态。即

/* 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);

希望对你有帮助。

【讨论】:

  • 在更一般的设置中,您希望使用while(state == GOOD)。条件变量假定多个线程在同一条件下等待的可能性。
  • 这是一个很好的例子,但是如果线程 1 在状态 not GOOD 时正在等待,不是更清楚吗?就目前而言,我看不到在状态当前为 GOOD 时等待的逻辑,然后在状态变为 GOOD 时醒来,因为没有状态变化(所以真的无事可做)......当然我可能误解了。有人可以澄清一下吗?
  • @Wad 在我看来,您是对的,但该网站不允许在六个字符以下进行编辑。如果将state == GOOD 更改为state != GOOD,这些示例对我来说很有意义
  • 可以解决 6-character-min-edit 限制。进行您想要的更改,并在顶部添加额外的评论。然后,如果您愿意,可以进行第二次编辑并删除附加评论。
  • 除了说 线程 2 不会唤醒线程 1 并且线程 1 将继续休眠,可能永远。,它涉及一个未定义的行为,两个解锁操作在同一个需要互斥锁。
猜你喜欢
  • 2021-07-14
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多