linux – flock锁定顺序?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – flock锁定顺序?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1385字,纯文字阅读大概需要2分钟。
内容图文
即时通讯使用简单的测试脚本
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的东西,但我的问题是:
谁知道flock()获得的顺序?
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.对于第一个之后的每个进程,在sem_op值为零的情况下对该进程的信号量执行semop() – 这将阻止它.在第一个进程完成后,它应该在sem_op值为1的情况下对第二个进程的信号量执行semop() – 这将唤醒第二个进程.第二个过程完成后,它应该在sem_op值为1的第三个进程的信号量上执行semop(),依此类推.
内容总结
以上是互联网集市为您收集整理的linux – flock锁定顺序?全部内容,希望文章能够帮你解决linux – flock锁定顺序?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。