【问题标题】:Does pthread_cond_wait and pthread_mutex_unlock conflict?pthread_cond_wait 和 pthread_mutex_unlock 是否冲突?
【发布时间】:2011-09-25 20:12:00
【问题描述】:

我在 Linux 中使用 pthread 实现手动重置事件,这类似于 Windows 中的 WaitForSingleEvent。我找到了这篇文章

pthread-like windows manual-reset event

并遵循它,但是有一件事情让我感到困惑:

void mrevent_wait(struct mrevent *ev) {
     pthread_mutex_lock(&ev->mutex);
     while (!ev->triggered)
         pthread_cond_wait(&ev->cond, &ev->mutex);
     pthread_mutex_unlock(&ev->mutex);
}
  • pthread_cond_wait: 原子地释放互斥锁并导致调用线程阻塞在条件变量 cond 上;
  • pthread_mutex_unlock: 尝试解锁指定的互斥锁。如果互斥锁类型为 PTHREAD_MUTEX_NORMAL,则不提供错误检测。如果线程尝试解锁未锁定的互斥锁或解锁的互斥锁,则会导致未定义的行为。

我害怕的是当 pthread_cond_wait 释放互斥锁时,然后 pthread_mutex_unlock 可能会出现未定义的行为(这种事情会让我发疯,他们怎么不处理它:-D)

谢谢。

【问题讨论】:

    标签: c++ multithreading pthreads


    【解决方案1】:

    The standard 说:

    成功返回后,互斥体已 被锁定并归 调用线程。

    这意味着当返回时,pthread_cond_wait原子地锁定关联的互斥体。

    工作流程是这样的:

    • 您锁定了一个互斥锁
      • pthread_cond_wait 原子地阻塞和解锁互斥体(因此其他线程可能会到达这里)
      • 当条件到达时,pthread_cond_wait 自动返回并锁定互斥体
    • 您解锁了互斥锁

    我不认为 pthread_cond_wait 阻塞 并解锁

    那是因为你没有阅读我提供的链接。

    这些函数原子释放 互斥并导致调用线程 在条件变量 cond 上阻塞

    【讨论】:

    • 总之,在pthread_cond_wait之后解锁互斥锁是有效的(并且是必需的)。
    • 我认为 pthread_cond_wait 不会阻塞和解锁。但是如果它先解锁互斥锁,然后再尝试锁回互斥锁,我认为这可能会导致这里出现死锁。顺便说一句,任何人都知道为什么我们必须将 pthread_cond_wait 放入 while 循环中?我可以只使用 if 语句吗?谢谢!
    • @longbkit 查看我编辑的答案。您的第二个问题在这里得到解答:stackoverflow.com/questions/6505567/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2017-04-23
    相关资源
    最近更新 更多