【问题标题】:Number of pthread_cond_signal()s and pthread_cond_wait()s mis/matchpthread_cond_signal()s 和 pthread_cond_wait()s 错误/匹配的数量
【发布时间】:2013-03-20 06:03:23
【问题描述】:

有一个生产者和n个消费者。 生产者我们将 n 个作业分配给 n 个消费者,并调用 pthread_cond_wait() n 次以等待消费者完成分配的作业。 每个Consumer消费完job后调用pthread_cond_signal()通知producer。

我的问题是“消费者对 pthread_cond_signal() 的 n 次调用是否会使生产者从 pthread_cond_wait() 中退出 n 次?或者是否存在将多个信号合并为单个信号以减少 pthread_cond_wait() 出现的情况超过n次?

【问题讨论】:

    标签: variables pthreads conditional-statements


    【解决方案1】:

    如果生产者在消费者线程调用pthread_cond_signal() 时实际上并没有在调用pthread_cond_wait() 中等待,那么该信号将“丢失”(即,如果生产者线程稍后滚动到pthread_cond_wait() ,它会阻塞直到发送另一个信号)。

    这就是为什么条件变量必须与其他一些“布尔谓词”一起使用的原因,该谓词在持有与条件变量一起使用的互斥锁时进行检查。该谓词是决定是否等待的线程是否应该等待的实际最终决定。谓词是最终决定的另一个原因是,在pthread_cond_wait() 中阻塞的线程可以被虚假唤醒。

    来自POSIX docs on pthread_cond_wait()

    当使用条件变量时,总是有一个布尔谓词 涉及与每个条件等待相关的共享变量 如果线程应该继续,则为 true。来自的虚假唤醒 可能会出现 pthread_cond_timedwait() 或 pthread_cond_wait() 函数。 由于从 pthread_cond_timedwait() 或 pthread_cond_wait() 返回 并不暗示这个谓词的价值, 谓词应在返回时重新评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多