我试图了解 pthread_cond_broadcast() 的工作原理,以及是否可以将线程“附加”到已被另一个线程阻塞的事件(广播信号)的等待列表(或队列)。
假设我们有两个线程。
线程 #1 在等待循环中
pthread_mutex_lock();
while(condition_is_false)
pthread_cond_wait();
pthread_mutex_unlock();
并且在这个过程中间的某个地方,当线程 #1 已经阻塞时,另一个线程 #2 调用相同或几乎相同的代码,希望“附加”到相同的 condvar:
pthread_mutex_lock();
while(condition_is_false)
pthread_cond_wait(); or pthread_cond_timedwait()
pthread_mutex_unlock();
据我了解,线程 #2 在解锁之前无法访问被互斥锁锁定的代码。我说得对吗?
我正在尝试实现下一个案例:有些任务需要时间才能完成。在此期间,不允许另一个线程复制已经在进行中的相同任务,而是等待它完成。当任务最终完成时,所有线程必须获得相同的结果。
最佳答案
您的场景正是设计条件变量的场景。
第二个线程实现对互斥量的锁定是没有问题的,因为wait(和派生)在wait期间临时释放互斥量,回来时重新获取。
您应该在大量有关互斥锁和条件变量概念的文档中明确阅读更多内容。
关于c - 不同线程在同一个 condvar 上调用 pthread_cond_wait() 和 pthread_cond_timedwait() 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23029621/