Linux上的Perl flock:如果许多进程等待打开一个锁定的文件怎么办?

Linux上的Perl flock:如果许多进程等待打开一个锁定的文件怎么办?,linux,perl,locking,Linux,Perl,Locking,如果许多进程在释放一个独占锁定的文件时等待打开该文件,会发生什么情况 我希望只有一个进程需要打开才能成功地再次打开文件,但事实似乎并非如此 我确实阅读了linuxflock系统调用(以及Perl的flock()函数)的文档,但我找不到任何关于该用例的内容 这是我的详细用例: 一些CGI perl进程调用局域网上的一个中央服务,这相当繁重和缓慢,如果一次由一个客户机调用,性能会更好。CGI请求可能很多(比如50~60个)并且是并发的,因此我使用flock机制作为信号量,让CGI进程在调用中央服务之

如果许多进程在释放一个独占锁定的文件时等待打开该文件,会发生什么情况

我希望只有一个进程需要打开才能成功地再次打开文件,但事实似乎并非如此

我确实阅读了linux
flock
系统调用(以及Perl的
flock()
函数)的文档,但我找不到任何关于该用例的内容

这是我的详细用例:
一些CGI perl进程调用局域网上的一个中央服务,这相当繁重和缓慢,如果一次由一个客户机调用,性能会更好。CGI请求可能很多(比如50~60个)并且是并发的,因此我使用
flock
机制作为信号量,让CGI进程在调用中央服务之前等待,一次一个

这是我用来实现信号量的(简化)代码:

open($LOCK, "+>" . "/tmp/semaphore.lock") or die("Can't open semaphore ($!)");
flock($LOCK, LOCK_EX) or die ("Can't lock semaphore ($!)");

# <CALL THE SLOW SERVICE>

flock($LOCK, LOCK_UN) or die("Can't unlock semaphore ($!)");
close($LOCK);
但是,我观察到的流程是:

CGI process A opens semaphore
CGI process A locks semaphore
CGI process A calls service
CGI process B opens semaphore
CGI process C opens semaphore
CGI process D opens semaphore
CGI process A unlocks semaphore
CGI process B locks semaphore
CGI process B calls service
CGI process C locks semaphore   (!)
CGI process C calls service     (!)
CGI process D locks semaphore   (!)
CGI process D calls service     (!)
CGI process B unlocks semaphore
...

答案(如果可能的话)应该优先考虑对当前代码进行尽可能少的修改的解决方案,因为它已经投入生产相当长的时间了,所以:更改越少越好…:-)

在任何给定时间,只有一个进程可以持有独占锁

因此,以下情况之一对您来说应该是正确的:

  • 要锁定的文件位于NFS设备上<代码>群集不支持这些
  • 您描述的对
    flock
    的调用发生在同一进程中<代码>群集不能用于排除同一进程的线程
  • 锁被打开了。请记住,解锁可能发生在分叉过程中

我无法复制这种行为。有时,一个进程在另一个进程的解锁和关闭之间锁定,但仅此而已。
CGI process A opens semaphore
CGI process A locks semaphore
CGI process A calls service
CGI process B opens semaphore
CGI process C opens semaphore
CGI process D opens semaphore
CGI process A unlocks semaphore
CGI process B locks semaphore
CGI process B calls service
CGI process C locks semaphore   (!)
CGI process C calls service     (!)
CGI process D locks semaphore   (!)
CGI process D calls service     (!)
CGI process B unlocks semaphore
...