博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于pthread_cond_wait()使用的理解
阅读量:6820 次
发布时间:2019-06-26

本文共 1526 字,大约阅读时间需要 5 分钟。

pthread_cond_wait()是linux多线程同步实现的一种方法,表示等待某一个线程共享变量满足了某种情况时
线程才能继续执行 pthread_cond_wait()之后的代码,如下面的示例代码段所示,thread_func()函数中的代码
示例是一种比较常见的等待共享变量的方式,这里主要关注 while(head == NULL)的使用
 
struct xxx* head; /** 全局线程共享变量*/pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; /** 为条件变量搭配的互斥锁*/pthread_cond_t cond = PTHREAD_COND_INITIALIZER; /** 定义全局线程共享的条件变量*/ staticvoid* thread_func(void*arg){/** 首先先获得互斥锁,表示同一时间只能有一个线程等待条件变量 * 如果没有保持只有一个线程监听条件变量的话,那有可能会引起线程的"惊群"现象 */pthread_mutex_lock(&mtx); /** 下面理解为什么需要先判断 head == NULL 的值(假设这里就是需要等待 head == NULL ) * 根据pthread相关文档理解: 假设线程1执行到pthread_cond_wait()时,首先线程释放mtx互斥锁, * 之后再开始等待pthread_cond_signal()或者pthread_cond_broadcast()发送过来的"条件满足信号" * 假如这时候某另外的一个线程2获得了mtx锁并改变head的值,使得head == NULL 并发送了信号且 * 完成之后释放了mtx锁, 这时候可能系统存在线程3正在等待获得互斥锁,那么现在有两种情况:1.线程3 * 获得锁,之后对head进行了一些操作,之后可能发送了信号,再释放了互斥锁;2.线程1获得了互斥 * 锁mtx,那么这时候线程1继续原来等待的逻辑,由于等待时释放了锁,现在需要重新获得这种情况也获得了, * 这时候程序执行while(head == NULL)的判断,ok, 现在能明白为什么这里需要判断 head == NULL ?了,因为在 * 上面情况1中线程3比线程1可能更早一步获得锁之后对head操作并使得head != NULL ,事实上大型的系统可能会有更多 * 的线程同时在竞争一个互斥锁,对于共享变量值的改变可能会有更多的情况,也就是说线程1进入等待之后释放锁, * 直到收到唤醒信号, 在去重新获得锁的过程中,不一定能在收到信号后作为第一个获得锁的线程,也就是在获得锁时 * 其他线程可能获得锁并改变了head的值,比如上面例子尽管线程2在head == NULL 时发出了信号。 * 线程1判断head == NULL是否满足,如果不满足条件,则重新释放mtx锁,并进入信号等待的过程,重复上面唤醒的逻辑 * 直到 head == NULL 时,程序执行之后的逻辑,最后释放mtx互斥锁 */while(head != NULL){pthread_cond_wait(&cond, &mtx);} /** head == NULL 时执行的逻辑*/... pthread_mutex_unlock(&mtx);//临界区数据操作完毕,释放互斥锁 return0;}
 以上所说的信号,并不是只unix/linux 信号量或者系统信号的概念,仅仅代表一种线程唤醒的通信方式

转载于:https://www.cnblogs.com/bicowang/p/3828568.html

你可能感兴趣的文章
依据奖品权重值实现的随机抽奖,PHP实现
查看>>
一些总结
查看>>
Unity3D入门中文版doc文档下载
查看>>
F5与BoCloud博云因技术结缘 携手加速容器生态系统在华落地
查看>>
Intent序列化
查看>>
js 计算两个时间的差
查看>>
有趣的Linux命令行功效
查看>>
解决PotPalyer不能拖放播放
查看>>
Linux安装mysql5.7
查看>>
HIVE常用操作以及函数
查看>>
【优达学城测评】SQL 支持许的数据类型(3)
查看>>
PHP CURL CURLOPT参数说明(curl_setopt)
查看>>
Learning NodeJs(1)
查看>>
怎么解决mysql远程连接报10038的错误
查看>>
js 父窗口可以找到子窗口的元素
查看>>
从FB10.3升级到11.0后几个问题的解决
查看>>
django使用MySql的基本步骤
查看>>
笔记《Java并发编程实战》[2]
查看>>
fpdf基本用法
查看>>
Linux下使用pure-ftpd建立匿名ftp访问
查看>>