Linux——信号量概念及其相关操作函数,并用信号量实现生产者消费者

信号量semaphore也是用于线程同步的锁机制,可以理解为是进阶版的互斥锁:
由于互斥锁的粒度较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁就没有办法实现,只能将整个对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却导致线程的并发性下降。线程就从并行执行变成了串行执行。与直接使用单进程一样了。

信号量相当于初始化为N的互斥量,可以允许同时有N个线程来访问公共区域。既能保证同步,数据不混乱,又能提高线程并发

信号量常见应用函数:
sem_init 初始化
sem_destory 销毁
sem_wait 加锁,信号量大于0,则信号量–;信号量等于0则线程阻塞
sem_trywait
sem_timedwait
sem_post 解锁,将信号量++,同时唤醒阻塞在信号量上的线程

sem_t类型,本质仍是一个结构体,但仍旧在应用期间可以看作一个整数

信号量不能小于0,需要头文件<semaphore.h>
由于信号量类型sem_t的实现对用户隐蔽,所以对信号量的++、–操作都只能通过函数来实现,为不能直接++、–信号量,即需要sem_wait()sem_post();另外,信号量的初值,决定了占用信号量的线程的个数

信号量不但可以应用在线程间也可以用在进程间,在初始化信号量中sem_init(sem_t *sem, int pshared, unsigned int value);第二个参数就用于决定是在线程间还是在进程间,0用于线程同步,非0进程同步;第三个参数就是N值,用于指定同时访问的线程数

借助信号量实现生产者消费者模型

在这里插入图片描述

一、创建两个线程,初始化信号量;对应回收线程销毁信号量
在这里插入图片描述
一开始是没产品的,所以消费者就阻塞sem_wait(&star_num)在产品上,等生产者生产商品
在这里插入图片描述
生产者生产出产品用sem_post(&star_num)唤醒阻塞的线程
在这里插入图片描述
====》当生产者将空格都填满时也会阻塞,阻塞在空位blank_num上;消费者每消费掉一个产品也需要唤醒信号量sem_post(&black_num);两者都会阻塞,两者都需要给对方一个唤醒
在这里插入图片描述

生产者和消费者;
在这里插入图片描述

aaaaaaa撒花❀❀❀下一步继续网络编程(要真的在linux上敲,习惯vim的用法),10号开始要项目和力扣同时开始(力扣看看东哥笔记吧),要记得还有数据结构再次整理复习andandandand xxx源码剖析,数据库也要深入掌握呀,这么说还有设计模式🙂不能多想,多想就是卒,anyway先做项目

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值