因此,我在堆栈溢出和其他资源方面进行了严格的搜索,但是对于上述功能我无法理解。具体来说,
1)当由于定时器值用完而返回pthread_cond_timedwait()时,它将如何自动重新获取互斥量。互斥锁可能被锁定在其他位置。例如,在生产者-消费者队列中,消费者可以使用timedwait()变体来等待。根据我已阅读的说明,似乎在线程唤醒时将自动重新获取互斥量。这让我感到困惑吗?还是它会在计时器用完后唤醒,然后检查谓词并再次锁定。这是没有意义的?
2)当一堆线程获取了一个互斥锁并且现在都在等待一个简单的pthread_cond_wait()时,如果另一个线程发出一个pthread_cond_broadcast()会发生什么。是否每个线程(由调度程序确定)都会被一个一个唤醒,按顺序获取互斥体,然后每个线程继续进行?或者将仅唤醒整个线程列表中的一个线程。我假设使用pthread_cond_signal()也可以实现两种行为中的后者。同样,如果先前的方法是正确的行为,那么我们可以假定其他某个线程可能最终在其他地方对该变量调用wait()。然后将所有其他等待线程放回阻塞状态并等待信号。还是每个人都会继续醒来并逐步取得进步?
最佳答案
如果pthread_cond_timedwait()
由于超时到期而返回,它将在返回之前重新获取互斥锁。如果互斥锁当时被另一个线程锁定,则可能意味着它必须等待互斥锁被解锁。本质上,它的行为就像在返回之前调用pthread_mutex_lock()
一样。
调用pthread_cond_broadcast()
时,所有等待线程都将被唤醒,这意味着它们都将尝试获取互斥量并返回。当然,互斥锁将对此序列化,因此它们一次只能返回一个。这之后发生什么无关紧要-这些线程一旦获得互斥量,最终都会全部从pthread_cond_wait()
调用返回。另一个调用pthread_cond_wait()
的线程不会对此产生影响。
关于c++ - pthread_cond_timedwait()和pthread_cond_broadcast()的解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21299957/