千家信息网

linux中条件变量和信号量有哪些区别

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍"linux中条件变量和信号量有哪些区别",在日常操作中,相信很多人在linux中条件变量和信号量有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2024年11月22日linux中条件变量和信号量有哪些区别

这篇文章主要介绍"linux中条件变量和信号量有哪些区别",在日常操作中,相信很多人在linux中条件变量和信号量有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"linux中条件变量和信号量有哪些区别"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

区别:1、使用条件变量可以一次唤醒所有等待者,而信号量不能唤醒;2、信号量始终有一个值(状态),而条件变量是没有值的,没有地方记录发送信号的次数,也没有地方记录wait返回的次数;3、信号量的意图在于进程间同步,条件变量意图在于线程间同步。

本教程操作环境:linux5.9.8系统、Dell G3电脑。

条件变量

条件变量(cond)使在多线程程序中用来实现"等待--->唤醒"逻辑常用的方法,是进程间同步的一种机制。条件变量用来阻塞一个线程,直到条件满足被触发为止,通常情况下条件变量和互斥量同时使用。

一般条件变量有两个状态:

(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中条件变量和信号量有哪些区别"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

信号 信号量 变量 条件 线程 同步 地方 中条 意图 状态 进程 学习 程序 量值 特殊 两个 情况 方法 更多 次数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 文创互联网科技是干什么的 智能科技互联网企业文化 中美执法 网络安全 互联网金融与科技发展论坛 和网络安全相关的英语 网络技术数学教学 河南安讯网络技术有限公司 网络安全的黑板报诗句 网络安全技术的技术背景 财务软件开发服务费 重庆华为服务器虚拟化技术 怎么保证数据库同步 网络安全活动准备 网络安全三管三监测题 六安直播软件开发哪家好 河北君坤互联网科技有限公司客服 数据库优化器选择执行路径 丽水软件开发框架 2018网络安全博览会在哪 数据库某个用户密码忘了怎么办 安徽软件开发服务五星服务 以网络安全为主题班会的结尾 网卡启动的服务器在哪 服务器m4和m5的区别 网络安全和运维开发一样吗 软件开发升职途径 自己在从事网络安全方面的感言 计算机网络技术答案张建忠 联机数据库型参考文献什么意思 关联数据库表
0