下面这个脚本能正确地发生死锁。
# 创建命名管道
# mkfifo /tmp/ff
exec 99<> /tmp/ff
# 创建生产进程往管道中写入数据
(while :
do
flock /tmp/ff -c 'seq 1 10 > /tmp/ff'
sleep 1
done
) &
# 创建消费进程从管道读取数据
(while :
do
flock /tmp/ff -c 'read i </tmp/ff;echo $i'
done
) &
wait
但是为什么改成下面这个脚本后就死锁不了呢?
# 创建命名管道
# mkfifo /tmp/ff
exec 11<> /tmp/ff
# 创建生产进程往管道中写入数据
(while :
do
flock 11
seq 1 10 > /tmp/ff
flock -u 11
sleep 1
done
) &
# 创建消费进程从管道读取数据
(while :
do
flock 11
read i </tmp/ff
echo $i
flock -u 11
done
) &
wait
按道理,当消费者进程消费速度快于生产进程时应该发生下面步骤呀:
- 消费者进程持有锁
- 消费者进程从管道读取消息,被阻塞
- 生产者往管道发送数据前需要先获取锁,但是该锁被消费者进程持有,导致生产者也被阻塞。