我使用一个简单的测试脚本http://www.tuxradar.com/practicalphp/8/11/0 http://www.tuxradar.com/practicalphp/8/11/0像这样
<?php
$fp = fopen("foo.txt", "w");
if (flock($fp, LOCK_EX)) {
print "Got lock!\n";
sleep(10);
flock($fp, LOCK_UN);
}
我打开了5个shell并依次执行了脚本
脚本会阻塞,直到锁被释放,然后在释放后继续
我对 php 的东西不太感兴趣,但我的问题是:
有人知道 slack() 的获取顺序吗?
e.g.
t0: process 1 lock's
t1: process 2 try_lock < blocking
t2: process 3 try_lock < blocking
t3: process 1 releases lock
t4: ?? which process get's the lock?
是否有一个简单的确定性顺序,例如队列,或者内核“只是”通过“更高级的规则”选择一个顺序?
如果有多个进程等待排它锁,则不指定哪个进程首先成功获取它。不要依赖任何特定的顺序。
话虽如此,当前的内核代码按照它们阻塞的顺序唤醒它们。这条评论在fs/locks.c
:
/* Insert waiter into blocker's block list.
* We use a circular list so that processes can be easily woken up in
* the order they blocked. The documentation doesn't require this but
* it seems like the reasonable thing to do.
*/
如果您想让一组进程按顺序运行,请不要使用flock()
。使用 SysV 信号量(semget()
/ semop()
).
创建一个信号量集,其中第一个进程之后的每个进程都包含一个信号量,并将它们全部初始化为 -1。对于第一个进程之后的每个进程,执行semop()
在该进程的信号量上sem_op
值为零 - 这将阻止它。第一个过程完成后,应该执行semop()
在第二个进程的信号量上sem_op
值为 1 - 这将唤醒第二个进程。第二个过程完成后,应该执行semop()
在第三个进程的信号量上sem_op
值为 1,依此类推。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)