信号量—Posix信号量

1.posix有名信号量&无名信号量(基于内存的信号量)

在这里插入图片描述

2.有名信号量

2.1创建&删除

一个进程终止时,内核会自动关闭该进程打开着的信号量,但关闭信号量并没有将信号量从系统删除,该信号量依然存在,只有调用sem_unlink才能从系统中删除。

在这里插入图片描述在这里插入图片描述

2.2 等待&挂出

每次只能加1或减1,与system V信号量不同(可加减任意整数)

在这里插入图片描述
在这里插入图片描述

3.基于内存的信号量

3.1创建&删除

需要注意对于一个内存信号量只能调用一次sem_init,sem_init失败时返回-1,但成功时并不返回0.
在这里插入图片描述
在这里插入图片描述

3.2 进程间共享信号量(有名信号量与基于内存的信号量区别)

基于内存的信号量要实现进程间共享,需要将该信号量放在共享内存区中,只要该共享内存区存在,该信号量就存在。**注意使用sem_init创建信号量后调用fork,子进程并不能直接使用该信号量,因为子进程不共享父进程的内存空间,这一点与有名信号量不同,调用sem_open创建的有名信号量由于是sem_open在内部动态申请的信号量(malloc申请在了堆上?),所以子进程可以直接使用父进程创建的有名信号量**,要理解基于内存的信号量创建是我们定义一个sem_t变量后,由sem_init函数对这个变量进行赋值,而有名信号量创建是调用sem_open后返回了一个sem_t指针,这意味着是sem_open内部malloc了一个sem_t变量,相当于基于内存的信号量是申请在了该进程的栈上,而有名信号量是申请在了堆上,这就是内存信号量不能在fork后直接使用,而有名信号量可以使用的原因(个人理解)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.互斥锁&信号量差别

注意当没有线程在等待条件变量时,若产生了条件变量信号,那么此信号将会丢失,而信号量则不会,若没有线程等待信号量,有线程挂出信号量以后,信号量值会增长

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值