首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

线程同步之条件变量(pthread_cond_wait

还是结合pthread_cond_wait()函数来分析一下吧! 下面给出本文讲使用的的有关条件变量的函数。 ? 单刀直入,我们需要分析的重点就是pthread_cond_wait()函数。...pthread_cond_wait()函数等待条件变量变为真的。它需要两个参数,第一个参数就是条件变量,而第二个参数mutex是保护条件变量的互斥量。...pthread_cond_wait()被唤醒时,它解除阻塞,并且尝试获取锁(不一定拿到锁)。...因此,一般在使用的时候都是在一个循环里使用pthread_cond_wait()函数,因为它在返回的时候不一定能拿到锁(这可能会发生饿死情形,当然这取决于操作系统的调度策略)。...这个pthread_cond_wait()函数可以被pthread_cond_signal()或者是pthread_cond_broadcast()函数唤醒。

18.4K31

编程小知识之 虚假唤醒(spurious wakeup)

g_signaled) { pthread_cond_wait(&g_cond, &g_mutex); } g_signaled = false...上述示例代码中,我们在设置 g_signaled 之后调用了 pthread_cond_signal,正常来讲的话,之前调用 pthread_cond_wait 的线程会被唤醒,此时 g_signaled...应该一定为真,但是细心的朋友应该会发现,代码中我们却使用了一个循环来检查 g_signaled 的真值(并在发现 g_signaled 不为真时释放互斥锁然后重新进入了等待(通过重新调用 pthread_cond_wait...g_signaled) { pthread_cond_wait(&g_cond, &g_mutex); } 这么做的一个原因便是为了处理 虚假唤醒(spurious wakeup),...虚假唤醒看上去很恼人,似乎我们应该在接口层消除这种现象(即让 pthread_cond_wait 不产生虚假唤醒),但有两个原因让虚假唤醒最终保留了下来: 1.

2.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    线程同步-条件变量

    文章目录 引言 条件变量 初始化条件变量:pthread_cond_init 销毁条件变量:pthread_cond_destroy 条件等待:pthread_cond_wait 唤醒等待:pthread_cond_signal...int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex); cond:要在这个条件变量上等待...调用 pthread_cond_wait 时,函数会释放锁以让其他线程可以修改共享资源,然后在条件满足后重新获取锁,这样可以保证在条件变量被触发后,线程能够再次安全地检查条件和访问共享资源。...避免竞争条件:如果 pthread_cond_wait 不释放锁,那么其他线程将无法获取这个锁并修改条件,这可能导致死锁或线程无法继续工作。...通过在 pthread_cond_wait 内部释放和重新获取锁,确保了条件检查的完整性和线程的正确同步。

    8710

    Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝慢慢看(2)

    结果是,当一个线程调用pthread_cond_signal()后,多个调用pthread_cond_wait()或pthread_cond_timedwait()的线程返回。...互斥锁必须是普通锁或适应锁,并且在进入pthread_cond_wait之前必须由本线程加锁。 在更新等待队列前,mutex必须保持锁定状态. 在线程进入挂起,进入等待前,解锁。...(好绕啊,我已经尽力断句了) 在条件满足并离开pthread_cond_wait前,上锁。以恢复它进入cont_wait之前的状态。 为什么等待会被上锁? 以免出现唤醒丢失问题。...唤醒丢失往往会在下面的情况下发生: 一个线程调用pthread_cond_signal或pthread_cond_broadcast函数; 另一个线程正处在测试条件变量和调用pthread_cond_wait...Note that the pthread_cond_wait routine will automatically and atomically unlock mutex while it

    43820
    领券