Linux进程同步机制

1. 互斥量

主要用在线程间,虽然通过改变它的属性可以支持进程间,但并非所有平台都支持,所以应当仅在线程间用。

2. 条件变量

因为需要互斥量配合使用,所以也只用在线程间,条件变量更像是一种通知机制(条件满足了通知等待的用户),它所附加的互斥量用于保护业务变量,之所以把这个互斥量交给内核代管是为了操作的原子性。

3. 信号量

信号量设计为进程间通信机制,所以应当用在进程间。

(1)最常用的是二元信号量,此时,它俨然就是把锁,原理跟线程间的互斥量一样。

(2)用作多元信号量时,它的作用其实更像是一种并发数目的限定。

(3)对于信号量函数semop如何使用,理解的关键点是sem_op为正时不等待,为0或负时等待。

(4)在<Unix-Linux编程实践>书中例子中,它对sem_op使用-1表示释放,这与常规用法相反,原因是它把信号量的值初始化为0,每当新增读时,用+1表示,相应的,就用-1表示释放读,这种用法实际上比较自然。那假如换一种思路,把信号量的值初始化为最大并发读数,那每当新增读时,就需要用-1,以表示可读并发数被消耗了一个,这种实际上就是(2)的思路。

(5)关于信号量的实例可参考<Unix-Linux编程实践>书中例子,它通过两个信号量实现了生产-消费队列上的多写多读。

(6)共享队列需要用到两个信号量实现支持读写同步,一写多读,写时等所有读完成,读时等写完成,但读读之间可以同时进行。参照Unix-Linux编程实践教程关于信号量的例子。

(7)系统规定,信号量值不会出现负值。

(8)信号量值初始值我们通常都置为0,然后通过sem_op=+1递增信号量值,通过sem_op=-1递减信号量值。
(9)注意,sem_op=0不是指信号量本身值是0,它是指示的操作值,表示要等待直到信号量值等于0,这里尤其注意是,等于0,也就是说,信号量值>0听起来好像是可用状态,但是,如果你操作为sem_op=0,那依然要等,直到它等于0,当然了,如果你操作为sem_op=-1,那因为信号量值>0,它就给信号量值递减1,并且不用等。
(10)对于sem_op=-1,因为信号量值不会出现负值,所以,如果信号量值当前是0,那么这个操作就会等,直到某个sem_op=+1使得信号量值>0以可减。

4. 文件锁

文件锁在线程和进程之间都可以用。文件锁并不是另外又创建了一个文件作为锁,而是直接给要同步访问的文件加锁。文件锁可以实现“我在写,写完成前任何人都必须等待”和“我在读,要写必须等我读完,其它要读的可以读”,即写时独占,读时共享。文件锁的使用例子可以参考<Unix-Linux编程实践>书中例子,它推荐使用fcntl。文件锁在<UNIX环境高级编程>中被翻译成记录锁,在14.3章节。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值