首页 >

linux中条件变量和信号量有什么区别

运维|linux运维linux中条件变量和信号量有什么区别
linux
运维-linux运维
手机qq登录界面源码,ubuntu直播系统,tomcat 反序列化,爬虫找网站,php项目怎么跑起来,武夷山一般seo价格lzw
条件变量
精仿2345网址导航源码,vscode字体设置代码,ubuntu编辑命令,jmx连接tomcat,sqlite 排序不成功,jquery 组合查询插件,美团前端用的是什么框架,爬虫真的能赚外快吗,繁体转简体 php,seo内容优化推广,个人网站支付宝测试,dw网页模板制作教程,dedecms模板编码lzw
条件变量(cond)使在多线程程序中用来实现“等待—>唤醒”逻辑常用的方法,是进程间同步的一种机制。条件变量用来阻塞一个线程,直到条件满足被触发为止,通常情况下条件变量和互斥量同时使用。
web新闻管理系统源码,vscode文件标签美化,ubuntu备份功能,tomcat突然关闭,sqlite 清空数据表,移动端播放器插件,如何配置前端框架环境变量,爬虫方面的参考文献,js怎么调用php,浙江seo优化模板,网站发布新闻管理,网页背景图片渐变特效,ecshop 模板制作软件lzw
一般条件变量有两个状态:

(1)一个/多个线程为等待“条件变量的条件成立“而挂起;

(2)另一个线程在“条件变量条件成立时”通知其他线程。

条件变量的使用:

#include struct msg {    struct msg *m_next;    /* ... more stuff here ... */};struct msg *workq;pthread_cond_t qready = PTHREAD_COND_INITIALIZER;pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;voidprocess_msg(void){    struct msg *mp;    for (;;) {        pthread_mutex_lock(&qlock);        while (workq == NULL)            pthread_cond_wait(&qready, &qlock);        mp = workq;        workq = mp->m_next;        pthread_mutex_unlock(&qlock);        /* now process the message mp */    }}voidenqueue_msg(struct msg *mp){    pthread_mutex_lock(&qlock);    mp->m_next = workq;    workq = mp;    pthread_mutex_unlock(&qlock);    pthread_cond_signal(&qready);}

当然,在触发条件变量时也可以用以下代码,两种方式各有优劣

voidenqueue_msg(struct msg *mp){    pthread_mutex_lock(&qlock);    mp->m_next = workq;    workq = mp;    pthread_cond_signal(&qready);    pthread_mutex_unlock(&qlock);}

信号量

信号量是一种特殊的变量,访问具有原子性。

只允许对它进行两个操作:

(1)等待信号量

当信号量值为0时,程序等待;当信号量值大于0时,信号量减1,程序继续运行。

(2)发送信号量

将信号量值加1。

说明:Linux提供了一组信号量API,声明在头文件sys/sem.h中。

linux 条件变量和信号量的区别:

(1)使用条件变量可以一次唤醒所有等待者,而这个信号量没有的功能,感觉是最大区别。

(2)信号量始终有一个值(状态的),而条件变量是没有的,没有地方记录唤醒(发送信号)过多少次,也没有地方记录唤醒线程(wait返回)过多少次。从实现上来说一个信号量可以是用mutex + counter + condition variable实现的。因为信号量有一个状态,如果想精准的同步,那么信号量可能会有特殊的地方。信号量可以解决条件变量中存在的唤醒丢失问题。

(3)信号量的意图在于进程间同步,互斥锁和条件变量的意图在于线程间同步,但是信号量也可用于线程间,互斥锁和条件变量也可用于进程间。应当根据实际的情况进行决定。信号量最有用的场景是用以指明可用资源的数量。

经典的一句话:

互斥量是信号量的一种特例,互斥量的本质是一把锁。

《Linux视频教学》


  • 暂无相关文章
  • Posted in 未分类