bash实现互斥、信号量的方法

【通过fifo实现信号量】

利用fifo的block-reading实现。

 


【通过flock+文件实现互斥和信号量

假设worker.sh为处理脚本(下同)

1、在调度worker.sh时(也就是worker.sh的外层)互斥,可以简单的通过flock实现。

优点:

将worker的逻辑与锁过程解耦

缺点:

需要统一的入口调度worker.sh

 

2、在worker.sh内实现互斥

文件lockfile.lock记录当前的锁curlock(唯一表示一个锁的特性值,如pid),通过flock实现lockfile.lock的互斥修改。

加锁过程:

1)flock读取当前锁curlock,curlock为空,记录特性锁到所文件lockfile.lock,否则重复读取当前锁curlock并验证的过程。

2)锁获取后即返回状态;锁超时或失败则可以相应的定义返回。

解锁过程:

与加锁过程类似,只是进行相反的过程。

简单的实例如下:

 

上面的例子很简单,需要处理的问题还有很多:

1)例子中锁是持久的、强制的,lock、unlock出现不匹配的情况下,就是杯具,因此要考虑到lock之后没有unlock的情况。比如,通过限制锁的最长有效期(可以简单的通过lockfile.lock的mtime判断),过期的锁等价于FREE

2)性能消耗

3)try_lock实现

3、实现信号量

基于上面的例子,实现信号两就比较简单了,之间将写入所文件的内容置为当前的信号数量,每获取一个信号就将文件中的数字减小1;释放信号量则相反。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值