gpt4 book ai didi

c - pthread_cond_wait(条件变量)如何仅一次而不是多次解锁所有线程?

转载 作者:行者123 更新时间:2023-11-30 18:45:29 25 4
gpt4 key购买 nike

我已经成功实现了一个生产者线程和 2 个工作线程或消费者线程。

生产者线程使用 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 并阻塞自身。

此时,两个线程都被阻塞等待条件,那么条件变量是否被重置?如果是这样,它如何知道何时重置,因为我可以有 5 个工作线程,而不是 2 个工作线程?

为什么线程 2 和线程 3 没有在相同的情况下再次解锁自己?

我想了解内部机制,即线程如何针对特定条件仅解锁一次,而不是再次解锁,直到发送新的广播为止。

我试图阅读有关此内容的内容,但我所能看到的是,如果发送条件广播,则等待该条件的所有线程都将被解除阻塞。我不明白的是为什么同一个线程不会多次针对相同的条件解除阻塞?

我尝试查看 pthread_cond_t,但找不到任何线索。

任何有关我的不足或想法错误的帮助或建议,我们将不胜感激。

谢谢

最佳答案

My question is why does Thread 2 or Thread 3 does not re-execute itself ?

因为条件变量不是这样工作的。

In other words, when the condition was broadcasted by Thread 1, lets say Thread 2 unblocks on the condition first, performs thread operation and calls thread_cond_wait and blocks itself.

Now Thread 3 unblocks on the condition, performs thread operation and calls thread_cond_wait and block itself.

At this point of time, both the threads are blocked waiting for the condition, so is the condition variable reset ?

这个问题表明由条件变量表示的状态模型很差,因为答案既是肯定的,也是否定的。实现细节可能有很大差异,但理论上,CV 管理的主要状态由当前在 CV 上等待的线程的“等待集”组成。这些线程无法继续,它们在 CV 上被阻止。

可以对 CV 执行三种主要操作:

  • 线程可以通过对其执行“等待”操作将自身添加到 CV 的等待集中,从而导致自身在 CV 上阻塞。
  • 线程可以通过对其执行“通知”操作,导致 CV 选择的单个其他线程从 CV 的等待集中(如果非空)中删除。就 CV 而言,两个线程都有资格继续进行。
  • 线程可以通过对其执行“广播”操作来清空 CV 的等待集。

CV 不携带指示它们是否已收到信号的持久状态。它们只知道它们的等待集和(在 pthread 的实现中)已从等待集中删除的线程在从等待操作返回之前必须获取的互斥体。无需重置 CV 来准备接受更多线程到其等待集中。

If so, how does it know when to reset, as instead of 2 worker threads, I could have 5 worker threads ?

它不会重置,与已经描述的操作没有任何区别。任何等待它的线程都会被添加到等待集中,并且只要它保留在那里,就没有资格被调度。 CV 上的任何信号和广播操作都会自动影响操作执行时的等待集。从等待集中删除的线程不再在 CV 上被阻塞,但它们可能会在获取关联的互斥体时被阻塞。

Why doesn't Thread 2 and Thread 3 unblock themselves again for the same condition ?

因为条件变量不是这样工作的。

线程 2 和 3 再次等待是 CV 支持的唯一重置类型。这些线程已被读取到等待集中,没有理由认为它们会在对该 CV 执行(另一个)信号或广播操作之前继续进行。没有过去信号/广播的内存,只有等待集的当前内容。

关于c - pthread_cond_wait(条件变量)如何仅一次而不是多次解锁所有线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54565328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com