互斥锁、条件变量、信号量浅析

互斥锁与条件变量

  1. 条件变量是为了保证同步 条件变量用在多线程多任务同步的,一个线程完成了某一个动作就通过条件变量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。信号量可以看作是有计数的条件变量。
  2. 互斥锁是为了保证互斥 互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,再解锁。互斥锁可以看作是二值信号量。
  3. 有的时候互斥锁和条件变量会同时使用的 条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足。在发送信号时,如果没有线程等待在该条件变量上,那么信号将丢失。

信号量

简介

信号量可以看作是互斥锁和条件变量的结合,而互斥锁和条件变量则可以看作是信号量的一种特殊形式

信号量:只要信号量的value大于0,其他线程就可以sem_wait成功,成功后信号量的value减一。若value值不大于0,则sem_wait阻塞,直到sem_post释放后value值加1。

以下是信号灯(量)的一些概念:

  1. 信号灯与互斥锁和条件变量的主要不同在于”灯”的概念,灯亮则意味着资源可用,灯灭则意味着不可用。如果说后两中同步方式侧重于**”等待”操作,即资源不可用的话,信号灯机制则侧重于"点灯"**,即告知资源可用;
  2. 没有等待线程的解锁或激发条件都是没有意义的,而没有等待灯亮的线程的点灯操作则有效,且能保持灯亮状态。
  3. 信号灯的应用除了灯亮/灯灭这种二元灯以外,也可以采用大于1的灯数,以表示资源数大于1,这时可以称之为多元灯。

信号灯(量)API

创建和注销

POSIX信号灯标准定义了有名信号灯和无名信号灯两种,但LinuxThreads的实现仅有无名灯,同时有名灯除了总是可用于多进程之间以外,在使用上与无名灯并没有很大的区别,因此下面仅就无名灯进行讨论。

  1. 创建

    int sem_init(sem_t *sem, int pshared, unsigned int value)

    这是创建信号灯的API,其中value为信号灯的初值,pshared表示是否为多进程共享而不仅仅是用于一个进程。LinuxThreads没有实现多进程共享信号灯,因此所有非0值的pshared输入都将使sem_init()返回-1,且置errnoENOSYS。初始化好的信号灯由sem变量表征,用于以下点灯、灭灯操作。

  2. int sem_destroy(sem_t * sem)

    被注销的信号灯sem要求已没有线程在等待该信号灯,否则返回-1,且置errnoEBUSY。除此之外,LinuxThreads的信号灯注销函数不做其他动作。

点灯和灭灯

  1. 点灯

    int sem_post(sem_t * sem)

    点灯操作将信号灯值原子地加1,表示增加一个可访问的资源,sem_post()是唯一能用于异步信号处理函数的POSIX异步信号安全的API。

  2. 灭灯

    int sem_wait(sem_t * sem)
    int sem_trywait(sem_t * sem)

    sem_wait()为等待灯亮操作,等待灯亮(信号灯值大于0),然后将信号灯原子地减1,并返回。sem_trywait()sem_wait()的非阻塞版,如果信号灯计数大于0,则原子地减1并返回0,否则立即返回-1,errno置为EAGAIN

获取灯值

int sem_getvalue(sem_t * sem, int * sval)

读取sem中的灯计数,存于*sval中,并返回0。

辨析拾遗

  1. 互斥锁必须是谁上锁就由谁来解锁,而信号量的wait和post操作不必由同一个线程执行。
  2. 互斥锁是为上锁而优化的;条件变量是为等待而优化的; 信号量既可用于上锁,也可用于等待,因此会有更多的开销和更高的复杂性。
  3. 互斥锁,条件变量都只用于同一个进程的各线程间,而信号量(有名信号量)可用于不同进程间的同步。当信号量用于进程间同步时,要求信号量建立在共享内存区。
  4. 信号量有计数值,每次信号量post操作都会被记录,而条件变量在发送信号时,如果没有线程在等待该条件变量,那么信号将丢失。

Ref:

http://blog.chinaunix.net/uid-20671208-id-4935154.html

http://blog.chinaunix.net/uid-23061624-id-79936.html

互斥锁、条件变量、信号量浅析相关推荐

  1. 信号量 互斥锁 条件变量的区别

    信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里).而互斥锁是用在多线程多任务互斥的,一个线程占用了某 ...

  2. 关于互斥锁,条件变量的内核源码解析

    一.解决问题和适用范围 主要是用来等待一个条件,这个条件可能需要另一个线程来满足这个条件.这个和我们平常适用的pthread_mutex_lock的最大不同在于后者保护的一般是一个代码段(也就是关键区 ...

  3. 信号量 互斥量 条件变量

    原文:https://blog.csdn.net/qq_32646795/article/details/78221005 本文打算写一些和锁有关的东西,谈一谈我对锁的原理和实现的理解,主要包含以下方 ...

  4. Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

    Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...

  5. FreeRTOS笔记篇:第七章 -- 资源管理(互斥锁、二进制信号量、死锁)

    测试环境如下 stm32F103C8T6 MDK keil5 stm32cube + FreeRTOS 概述 在多任务处理系统中,如果一个任务开始访问资源,但在脱离运行状态之前没有完成其访问,则有可能 ...

  6. pthread和互斥量条件变量函数意义速查表

    数据类型 pthread_t 线程 互斥量和条件变量

  7. [openmp]使用嵌套互斥锁锁定变量

    本文出自:http://www.cnblogs.com/svitter 转载请注明出处. 如果有一个线程必须要同时加锁两次,只能用嵌套型锁函数 函数名称 描述 void omp_init_nest_l ...

  8. c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)

    目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...

  9. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  10. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

    上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html  现在有这篇文章: http://blog.csd ...

最新文章

  1. 技术11期:Atlas的概念你了解多少?
  2. 学好python可以做什么兼职-自学Python能干些什么副业
  3. C++ 友元(友元函数和友元类)
  4. linux 字符串转数字排序,linux中sort命令排序功能实现方法
  5. 谷歌不支持调用摄像头麦克风_谷歌发布安卓11系统:全新界面、更严的隐私管理...
  6. 正则表达式 学习笔记3.4
  7. Python unittest中初始化固件setUp和销毁固件tearDown详解
  8. VLC设置串流的TTL值
  9. 华为或向苹果出售 5G 芯片;拼多多回应苹果停止供货;微信再推新功能! | 极客头条...
  10. 【正在完善】高级CSS特效解析其示范案例
  11. 大整数的代数运算_高等代数教学笔记2:多项式I
  12. PowerDesigner生成Oracle数据库时,表名会带引号问题
  13. 用word怎么做c语言框图作业,在Word中绘制简单C语言流程图(精)
  14. 零基础考公务员,备考多长时间最合适?
  15. linux命令tar -xzvf等
  16. 如何屏蔽 iOS 软件自动更新,去除更新通知和标记
  17. python中文分词算法_基于Python语言的中文分词技术的研究
  18. 占据栅格地图构建(Occupancy Grid Map)
  19. 1952-2018年中国各省份人均GDP
  20. Excel插入图片(C#)

热门文章

  1. IDEA JDK1.8 ProGuard 混淆Maven项目代码
  2. Haproxy 管控台介绍
  3. Linux环境 Jenkins集成构建SonarQube
  4. 郫都区计算机学校,成都郫县好升学的计算机学校有哪些
  5. java类验证和装载顺序_Java类的加载机制和双亲委派模型
  6. python wxpython radiobutton 能不能默认不选择_Python啥都行_Robot自动化测试
  7. angular7.2构建包如何兼容ie_Python 小技巧:如何实现操作系统兼容性打包?
  8. 重构碎片化知识_day22重构力-思维导图:让碎片化知识的零存整取
  9. C语言 vprintf 函数 - C语言零基础入门教程
  10. android unix时间,android: 日期转Unix时间戳,Unix时间戳转日期,带时区