【问题标题】:pthread_cond_broadcast unblocks a thread not waiting on conditional variablepthread_cond_broadcast 解除阻塞不等待条件变量的线程
【发布时间】:2016-09-05 05:51:12
【问题描述】:

我正在使用 POSIX,我有 3 个线程。

请注意以下所有线程都使用相同的互斥锁。

线程 1 正在使用 pthread_cond_wait 等待满足条件(等待在 while 循环内,因此它也不是无条件等待)。 当条件满足时,线程 2 将发出 pthread_cond_broadcast。 线程 3 使用互斥锁进行锁定,但不等待条件变量。

所以,线程 1 正在等待信号/广播,线程 3 正在等待互斥锁(该线程只是在等待获取互斥锁)。现在如果线程 2 发送一个广播,不知何故线程 3 正在获取互斥锁而不是线程 1。为什么会发生这种情况?我正在使用 glibc2.19 使用 debian 8.3。 广播不应该唤醒在条件变量上等待的线程吗?

【问题讨论】:

  • 为什么不应该等待互斥锁的线程一旦不再被任何其他线程持有就获取它?

标签: c multithreading posix


【解决方案1】:

我假设您在线程 2 中锁定了一个互斥锁(否则您的问题没有意义)。因此,当您调用pthread_cond_broadcast 时,它只会解除阻塞等待条件变量的线程。没有执行转移发生。

然后您解除对互斥锁的阻塞,并期望应该调度正在等待的线程。但是这种期望是错误的,因为由调度程序决定下一个要调度的线程,并且由于互斥体不再锁定,因此线程 3 也未阻塞。因此,由调度程序决定接下来将运行哪个(1 或 3)。在这种情况下没有任何限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多