信号量

作者: 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数组的索引加上互斥锁来保护静态变量

    相关文章

      网友评论

          本文标题:信号量

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