pthreads:使用 while 循环进行pthread_cond_wait背后的逻辑
Pthreads: The Logic Behind Using While Loops for pthread_cond_wait
我很难理解为什么使用 while 循环来pthread_cond_wait。让我们举一个简单的例子。下面是一些工作线程:
pthread_mutex_lock (&loadingLock);
while (isReadyToLoad == false){
pthread_cond_wait(&readyCondition, &loadingLock);
}
pthread_mutex_unlock (&loadingLock);
因此,现在主线程执行两件事:
- 将 isReadyToLoad 设置为 true
- pthread_cond_signal(和就绪条件(;
这就是我通常如何看待示例中列出的 pthreads 框架。我的问题是 while 循环是如何有效的。当我尝试跟踪逻辑时,我得到以下步骤:
- 主集是准备加载为 true
- X 对于工作线程中的 while(x( 不再为真
- 因此,while 循环被断开,这意味着 pthread_cond_wait(&readyCondition, &loadLock( 被绕过,永远不会收到信号
显然,我的逻辑在某个地方是有缺陷的,但我不确定我应该如何思考这个问题,并希望得到任何澄清。
pthread_cond_wait
存在,以便工作线程将丢弃loadingLock
锁并在条件isReadyToLoad == true
尚未满足时进入睡眠状态。因此,如果在工作线程到达 while 循环之前已经满足条件,则根本不需要进入 while 循环并运行pthread_cond_wait
。
请记住,您处于多线程环境中,这意味着发生的顺序可能会以不可预测的方式变化。一种可能的情况是,工作线程在主线程将isReadyToLoad
设置为 true 之前到达 while 循环。因此,工作人员必须调用pthread_cond_wait
并等待,直到主服务器实际将isReadyToLoad
设置为 true 并调用pthread_cond_signal
来唤醒工作人员。
就像Jesper Juhl所说,虚假的唤醒有时可能会没有任何理由地发生。在这种情况下,工人醒来,看到条件仍然不满意,然后再次进入睡眠状态。
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::memory_order for std::atomic:<T>:wait
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- std::future::get()或std::future::wait()是std::thread::join()的替
- 在 while 循环中使用 std::condition_variable::wait 是否正确
- Eclipse CDT 将 static_assert(cond) 突出显示为语法错误
- future::wait() 是否与 async() 执行线程的完成同步?
- 为什么'wait with predicate'求解条件变量的'lost wakeup'?
- 线程锁定互斥锁的速度比 std::conditional_variable::wait() 快
- deadline_timer::wait 是否让位于其他任务
- std::future::wait 是内存障碍吗?(我无法解释这种数据竞赛)
- 如何退出 QThread::wait()
- 在给定表达式的情况下返回对类型的引用时出错:“cond ?*这个 : 投掷()'
- [expr.cond]/2 中不是缺少一些东西吗?
- 当Qtest :: Qwait(..)成功时,Qsignalspy :: Wait(..)失败
- 如何在Wait()C++期间同时调用另一个函数
- GSL 的预期 (cond) 对运行时施加的性能影响是什么?
- 条件变量的"wait"函数在提供谓词时导致意外行为