广告
返回顶部
首页 > 资讯 > 操作系统 >linux中条件变量和信号量有哪些区别
  • 525
分享到

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

2023-06-30 13:06:18 525人浏览 泡泡鱼
摘要

这篇文章主要介绍“linux中条件变量和信号量有哪些区别”,在日常操作中,相信很多人在linux中条件变量和信号量有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中条件变量和信号量有哪些区别

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

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

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

条件变量

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

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

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

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

条件变量的使用:

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

--结束END--

本文标题: linux中条件变量和信号量有哪些区别

本文链接: https://www.lsjlt.com/news/329201.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linux中条件变量和信号量有哪些区别
    这篇文章主要介绍“linux中条件变量和信号量有哪些区别”,在日常操作中,相信很多人在linux中条件变量和信号量有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux中条件变量和信号量有哪些区别...
    99+
    2023-06-30
  • php中变量和常量有哪些区别
    php中变量与常量的区别有以下几点名称不同php中变量名需使用($)符号进行修饰,常量名则不需要,变量名建议使用小写,常量名建议使用大写。定义方式不同php中变量一般在赋值时进行定义,无法使用关键字或函数进行定义,而常量必须使用define...
    99+
    2022-10-17
  • linux下信号量和互斥锁的区别有哪些
    这篇文章主要讲解了“linux下信号量和互斥锁的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下信号量和互斥锁的区别有哪些”吧!linux下信号量和互斥锁的区别是:1、信...
    99+
    2023-06-29
  • php中静态变量和普通变量有哪些区别
    这篇“php中静态变量和普通变量有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php中静态变量和普通变量有哪些区别...
    99+
    2023-06-29
  • php中变量与常量有哪些区别
    这篇文章给大家分享的是有关php中变量与常量有哪些区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。区别:1、常量只能用define()函数或const关键字定义;而变量没有定义的关键字或函数,在赋值的时候被定义...
    99+
    2023-06-25
  • php中const和static变量有哪些区别
    这篇文章将为大家详细讲解有关php中const和static变量有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。区别:const一旦被定义不可更改,static修饰的变量是可以被更改的。const...
    99+
    2023-06-14
  • php常量和静态变量的区别有哪些
    这篇文章主要为大家展示了“php常量和静态变量的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php常量和静态变量的区别有哪些”这篇文章吧。php中常量和静态变量的区别:1、常量都是不...
    99+
    2023-06-29
  • javascript中全局变量与局部变量有哪些区别
    这篇文章主要讲解了“javascript中全局变量与局部变量有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript中全局变量与局部变量...
    99+
    2022-10-19
  • js全局变量和php全局变量的区别有哪些
    本文小编为大家详细介绍“js全局变量和php全局变量的区别有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“js全局变量和php全局变量的区别有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。js全局变量和...
    99+
    2023-06-29
  • java中整型常量和整型变量的区别有哪些
    这篇文章主要为大家展示了“java中整型常量和整型变量的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中整型常量和整型变量的区别有哪些”这篇文章吧。我下图代码第五行和第九行分别...
    99+
    2023-06-02
  • java中局部变量与全局变量的区别有哪些
    本篇文章为大家展示了java中局部变量与全局变量的区别有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、局部变量:局部变量的定义:定义在方法中的变量都是局部变量(main方法也是方法,所以定义...
    99+
    2023-05-31
    java 局部变量 全局变量
  • java中不同变量的区别有哪些
    这篇文章将为大家详细讲解有关java中不同变量的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点...
    99+
    2023-06-14
  • C#中静态变量与非静态变量的区别有哪些
    这篇文章主要为大家展示了“C#中静态变量与非静态变量的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中静态变量与非静态变量的区别有哪些”这篇文章吧。静态变量:静态变量使用 stat...
    99+
    2023-06-17
  • linux中单引号和双引号的区别有哪些
    这篇文章给大家分享的是有关linux中单引号和双引号的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。区别:单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用;而双...
    99+
    2023-06-25
  • javascript中常量池和堆的区别有哪些
    本篇内容介绍了“javascript中常量池和堆的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2022-10-19
  • linux中目录和文件的区别有哪些
    本篇内容介绍了“linux中目录和文件的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!区别:1、存储的数据不同,目录中存储了一张表...
    99+
    2023-07-02
  • SQL中过滤条件放on和where中的区别有哪些
    这篇文章主要介绍SQL中过滤条件放on和where中的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!join过程可以这样理解:首先两个表做一个笛卡尔积,on后面的...
    99+
    2022-10-18
  • sqlserver和oracle中对datetime进行条件查询的区别有哪些
    这篇文章主要讲解了“sqlserver和oracle中对datetime进行条件查询的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“sqlserv...
    99+
    2022-10-18
  • MySQL left join操作中on和where放置条件的区别有哪些
    这篇文章给大家分享的是有关MySQL left join操作中on和where放置条件的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。优先级两者放置相同条件,...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作