- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经成功实现了一个生产者线程和 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 不携带指示它们是否已收到信号的持久状态。它们只知道它们的等待集和(在 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/
很久没看APUE,今天一位朋友问道关于一个mutex的问题,又翻到了以前讨论过的东西,为了不让自己忘记,把曾经的东西总结一下。 先大体看下网上很多地方都有的关于pthread_cond_wait()
为什么在调用 pthread_cond_wait 之前需要锁定互斥锁? 此外,在调用 pthread_cond_signal 之前是否需要锁定(在同一个互斥体上)? ? 谢谢你的帮助。 最佳答案 Wh
从这里:https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal Note that the pthread_cond_wait rout
我正在编写各种代码片段,看看会发生什么。下面的代码旨在延迟所有线程,直到所有线程都到达代码中的某个点,然后使每个线程打印一个独特的数字。由于线程都这样做,因此数字应该以随机顺序出现。 我当前的问题是我
这个问题是关于 llnl 中的 pthread 教程。 。假设有三个线程。 主题 1: pthread_mutex_lock(&mutex) do_something... if condition
因此,pthread_cond_wait()的想法是,它将解锁互斥体并等待条件。 假设您首先手动解锁互斥体,然后等待条件出现。在该时间范围内,在这两个操作之间,您必须假设可能会发生一些不好的事情,另一
我有一个线程 A,其函数在循环中运行,执行某些操作并唤醒另一个线程 B。然后它释放互斥体并继续下一次迭代。线程 B 等待直到收到信号,然后执行某些操作。我的问题是,是否保证 B 在收到信号后会获取互斥
我正在尝试解决 Dining philosophers problem使用 C++。 代码是用 g++ -lpthread 编译的。 整个解决方案在 philosophers github 上.存储库
首先,我的问题是不同的。 在我的场景中,有一个等待线程,它等待条件变量。信号线程信号条件变量。 我的代码是 //Wating thread //Lock the mutex_ //mutex_ is
我正在尝试以我认为应该使用的方式使用 pthread_cond_wait。我在一个等待改变的方法中使用它,当它改变时,它会调用另一个方法来获取数据。如下所示: void waitForSomethin
我的堆栈中有一段代码正在运行,等待 pthread_cond_wait。信号被发送到同一进程,但信号处理程序中没有“pthread_cond_signal”代码来通知 pthread_cond_wai
如果线程调用 pthread_cond_wait(cond_ptr,mutex_ptr) 将返回一个null cond_ptr,是否保证不会睡着? 根据 http://pubs.opengroup.o
关于下面的代码,我的理解是线程1抢锁,检查条件,解锁时钟,将自己置为休眠状态。之后,线程 2 申请相同的锁和增量计数,然后唤醒休眠线程。我的问题是现在的条件还是false,但是唤醒了休眠的线程,会发生
我正在使用 pthread_cond_wait() 但我仍然不确定它是如何工作的。我有更多线程,可以完成这项工作: pthread_mutex_lock(&mutex); while(count()
这个问题是关于 llnl 中的 pthread 教程的.假设有三个线程。 线程 1: pthread_mutex_lock(&mutex) do_something... if condition
bool flag=false; pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond=PTHREAD_COND_I
长话短说 我有一个作业需要实现线程同步。在实现过程中,我担心 pthread_cond_wait() 是否也锁定了互斥锁,如果它被虚假唤醒,而不仅仅是成功唤醒。 任务 该任务是一个工作人员/交付问题,
pthread_cond_wait 是否将调用线程置于等待状态以被 pthread_cond_signal/pthread_cond_broadcast 唤醒,这样它就不会轮询和搅动 CPU? 另外,
我目前正在尝试分析第三方源代码中的一个问题,其中线程(对应于 THREAD-T1 的代码片段)处于无限等待状态。怀疑是线程卡在了pthread_cond_wait。以下是相同的详细信息。 代码说明 T
我有以下代码: typedef struct { ... volatile int i_lines_completed; pthread_mutex_t mutex; q265
我是一名优秀的程序员,十分优秀!