- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个作业需要实现线程同步。在实现过程中,我担心 pthread_cond_wait()
是否也锁定了互斥锁,如果它被虚假唤醒,而不仅仅是成功唤醒。
该任务是一个工作人员/交付问题,其中有工作线程和管理线程为工作人员提供订单。为此,有一个订单列表,工作人员从中获取订单,管理线程存放订单。订单列表是共享对象,需要同步。
我想到了这个问题,我需要一个列表监视器来保护它免受空的访问或当它已满时的存款。
void deposit_order(order_list* ol, order* o){
pthread_mutex_lock(&(ol->mut_order_access));
while(get_count(ol) >= MAX_ORDERS) {
pthread_cond_wait(&(ol->cond_not_full), &(ol->mut_order_access));
}
ol->orders[ol->head] = o;
ol->head = (ol->head+1)%MAX_ORDERS;
ol->count++;
pthread_cond_signal(&(ol->cond_not_empty));
pthread_mutex_unlock(&(ol->mut_order_access));
}
order* get_order(order_list* ol) {
pthread_mutex_lock(&(ol->mut_order_access));
while(get_count(ol) <= 0) {
pthread_cond_wait(&(ol->cond_not_empty), &(ol->mut_order_access));
}
order* o;
o = ol->orders[ol->tail];
ol->tail = (ol->tail+1)%MAX_ORDERS;
ol->count--;
pthread_cond_signal(&(ol->cond_not_full));
pthread_mutex_unlock(&(ol->mut_order_access));
return o;
}
我认为结构包含什么并不重要,因为主题是如何同步访问。显然,order_list
结构包含一个 mutex
和两个向另一个线程发送信号的条件变量。因此,如果一个工作人员从列表中删除一个任务,它会向管理线程发出“不为空”的信号,以便它可以存放一个额外的订单。如果管理层存入一个订单,则向工作线程发出“不为空”的信号,这样一个线程就可以从列表中删除一个订单。
到目前为止一切顺利,但现在我认为上述解决方案可能很关键,这就是“虚假唤醒”。来自 this thread我了解到,如果相应的互斥锁 mut_order_access
被另一个线程锁定,则线程无法虚假唤醒。但是,如果列表中只有一个订单,因此 get_count(ol) >= MAX_ORDERS
未满足并且线程虚假地从等待中唤醒,检查条件并将其标记为未满足怎么办true 并跳出循环。然后另一个线程收到信号并在前一个线程已经在临界区后正常唤醒并锁定互斥锁。因此,现在两个线程都将处于失败的关键区域。
所以只有当一个线程在虚假唤醒时没有锁定互斥量时才会发生上述情况,那么它是否在虚假唤醒时锁定了互斥量?
最佳答案
您对虚假唤醒条件的理解似乎不正确。虚假唤醒与互斥量是否被另一个线程锁定无关。除非您有编程错误(破坏这些函数的契约、一般内存损坏或其他未定义的行为等),否则 pthread_cond_wait
永远不会在调用线程持有(锁定)互斥锁的情况下返回。在虚假唤醒的情况下,它仍然无法返回,直到重新获取互斥锁。即使在使用 pthread_cancel
取消服务员的情况下,取消清理处理程序也无法开始运行,直到重新获取互斥体。
关于c - pthread_cond_wait 是否锁定互斥量和虚假唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56707687/
很久没看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
我是一名优秀的程序员,十分优秀!