信号量

作者: StevenHD | 来源:发表于2020-12-02 19:52 被阅读0次

线程中的信号量

  • 有名信号量:进程通信
  • 无名信号量:线程通信
  1. 初始化:调用sem_init()就可以创建成功,value=1相当于互斥锁,value > 1可以表示资源
  2. sem_wait():-1操作,如果信号量为0就会阻塞
    sem_trywait()则是非阻塞,出错了errno会设置为EAGAIN
  3. sem_post():释放,给信号量+1
  • 3个线程A, B, C,实现A先执行一段代码,然后B执行一段代码,最后C执行一段代码

需要3个信号量
A执行的时候让B和C都等待,如何等待呢?B和C线程初始化信号量为0,就会处在等待

  • A执行完后给B的信号量+1,从而B就唤醒,执行完B后给C的信号量+1,从而C被唤醒
  • 如何实现循环执行呢?给C那里也添加一个A的信号量即可,初始的时候让A的信号量为1就可以了——

除此之外,信号量可以当作资源的个数使用——


进程中的信号量

  • 信号量的值为1相当于是互斥锁
  • sem_wait()会阻塞等待
  • sem_trywait()不会阻塞当前线程,如果没有获取到信号量,会返回一个EAGAIN

1.1 线程交替运行

  • sem = 0意味着资源为0
  • 线程的入口函数一般是函数指针的形式
  • 主线程中使用join是让主线程等待子线程
  • 信号量的第一种用法——互斥锁,第二种用法——让线程交替运行

三个线程A,B,C,还有对应的3个信号量,除了第一个初值是1以外,其他2个初值都是0。


图示代码1
图示代码2
图解,使用semphore进行排队
线程A, B, C交替执行

1.2 信号量作为资源个数的使用

消费者——生产者模型

  • 仓库中有5个资源
  • 商品有0个资源
  • 对于资源数组value,如果有多个生产者和多个消费者,那么就需要给value数组的索引加上互斥锁来保护静态变量

相关文章

  • 第二章 信号量机制及几个经典例题

    1.信号量机制 信号量机制即利用pv操作来对信号量进行处理。 什么是信号量?信号量(semaphore)的数据结构...

  • iOS底层--GCD应用

    手动目录GCD简介信号量信号量的理解信号量的使用信号量的代码实操信号量阻塞哪里的任务?栅栏函数dispatch_b...

  • dispatch_semaphore_t

    dispatch_semaphore_t :信号量包含三个函数:1、创建信号量 2、增加信号量 3、削减信号量 注...

  • [java并发编程]基于信号量semaphore实现限流器

    [TOC] 一、什么是信号量 “信号量”在编程术语中使用单词semaphore,那什么是“信号量”?信号量就好比你...

  • iOS GCD信号量的使用

    什么是信号量 信号量是一种特殊的变量,访问具有原子性。 当信号量大于0时执行wait操作信号量会减1, 当信号量为...

  • dispatch_semaphore_t

    一、信号量 semaphore叫做“信号量” 1、创建信号量dispatch_semaphore_create(l...

  • GCD信号量使用

    一、信号量 semaphore叫做“信号量” 1、创建信号量dispatch_semaphore_create(l...

  • 理解操作系统之信号量的应用

    利用信号量实现进程互斥(模式) 利用信号量实现前驱关系(模式) 利用记录型信号量实现同步(模式) 1.利用信号量实...

  • FreeRTOS学习笔记(4)——信号量

    一、头文件 二、二值信号量 2.1 运作机制 创建信号量时,系统会为创建的信号量对象分配内存,并把可用信号量初始化...

  • CRTOS——互斥信号量

    互斥信号量等待操作: 1、等待互斥信号量,互斥信号量未被占有(锁定次数为0),占有过程中将信号量拥有者指向任务,并...

网友评论

      本文标题:信号量

      本文链接:https://www.haomeiwen.com/subject/jubuwktx.html