【发布时间】:2019-07-01 02:19:41
【问题描述】:
我已经成功实现了一个生产者线程和两个工作线程或消费者线程。
生产者线程使用 pthread_cond_broadcast 广播条件。并且工作线程被 pthread_cond_wait 阻塞。
代码看起来像这样:
线程 1(生产者线程):
pthread_mutex_lock
pthread_cond_broadcast
pthread_mutex_unlock
线程 2(工作者/消费者线程):
work = 1
while(1)
{
pthread_mutex_lock
while(!work)
{
work = 1;
pthread_cond_wait
}
// Thread operation
work = 0;
pthread_mutex_unlock
}
线程 3(工作者/消费者线程):
work = 1
while(1)
{
pthread_mutex_lock
while(!work)
{
work = 1;
pthread_cond_wait
}
// Thread operation
work = 0;
pthread_mutex_unlock
}
我的问题是为什么线程 2 或线程 3 不重新执行自身?
换句话说,当线程 1 广播条件时,假设线程 2 先解除对条件的阻塞,执行线程操作并调用 thread_cond_wait 并阻塞自己。
现在线程 3 根据条件解除阻塞,执行线程操作并调用 thread_cond_wait 并阻塞自身。
此时,两个线程都被阻塞等待条件,那么条件变量是否重置?如果是这样,它如何知道何时重置,而不是 2 个工作线程,我可以有 5 个工作线程?
为什么线程 2 和线程 3 不能在相同的条件下再次解除阻塞?
我想知道内部机制,关于线程如何为特定条件仅解除阻塞一次,而不是再次解除阻塞,直到发送新的广播。
我曾尝试阅读此内容,但我只能看到,如果发送了条件广播,则等待该条件的所有线程都将被解除阻塞。我不明白的是为什么同一个线程不会多次为同一个条件解除阻塞?
我尝试查看 pthread_cond_t,但没有得到任何线索。
任何关于我缺乏或想法错误的帮助或建议,我们将不胜感激。
谢谢
【问题讨论】:
标签: c linux multithreading pthreads conditional-statements