【问题标题】:Should a thread always use a while loop to hold a pthread_cond_wait statement?线程是否应该始终使用 while 循环来保存 pthread_cond_wait 语句?
【发布时间】:2020-03-06 15:52:27
【问题描述】:

我了解线程的虚假唤醒可能发生在 pthread 中。以下讨论很有趣且内容丰富:Why does pthread_cond_wait have spurious wakeups?。我的问题可能很明显,但我想确保我理解正确。当@acm 声明“......你已经总是​​需要检查循环下的谓词”时,这意味着我们应该使用 while 循环而不是 for 语句来测试条件,因为前者会重新- 测试条件是否为真,而后者将允许看似虚假唤醒的线程继续执行,即使在达到 CPU 时条件可能不再成立?

【问题讨论】:

  • 我不明白你在 while 循环和 for 循环之间有什么区别。它们只是 if 和 goto 的不同语法糖。
  • @Employed Russian 答案中突出显示的部分是我所做的区分。这样的条件应始终在 while 循环而不是 for 循环下检查,尽管您可以将 for 循环编写为基本上是 while 循环。回顾这个问题,这很明显,但由于它已经解决了,所以我将其搁置。

标签: c pthreads condition-variable


【解决方案1】:

当@acm 声明“......你已经总是​​需要检查循环下的谓词”时,这意味着我们应该使用while循环而不是for语句来测试条件,

正如 R 已经说过的,两者之间没有区别:

while (!predicate()) {
  pthread_condition_wait(...);
}

for (...; !predicate(); ...) {
  pthread_condition_wait(...);
}

您可以使用任何一种循环编写正确的代码或错误的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2012-05-22
    • 2011-06-06
    • 2021-10-03
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多