2011-11-17 96 views
1

如何在perl中使用IPC :: Shareable时检查其他人是否持有锁。 我有下面的代码:检查IPC可共享锁

my $resource = 0; 
my $resource_handle = tie $resource, 'IPC::Shareable', undef , { destroy => 1 }; 

my $child = fork; 
unless ($child) { 
    $resource_handle -> shlock(); 
    sleep 10; 
    $resource_handle -> shunlock(); 
    exit(0); 
} 
sleep 2; 
if ($resource_handle -> shlock(LOCK_EX)) { 
    print "Got lock in parent\n"; 
    $resource_handle -> shunlock(); 
} else { 
    print "The shared resource is locked\n"; 
} 

这版画“了锁父” 10秒后,而我希望它打印出“共享资源被锁定”。

回答

3

你想做一个非阻塞锁。锁定电话将立即返回。如果锁定可用,锁定呼叫的返回值将为true,并且您将获得锁定。如果返回值为假,则其他东西拥有该资源。

if ($resource_handle -> shlock(LOCK_EX | LOCK_NB)) { 
    print "Got lock in parent\n"; 
    $resource_handle -> shunlock(); 
} else { 
    print "The shared resource is locked\n"; 
} 
+0

你可以请多解释一下。这确实奏效。 “LOCK_EX | LOCK_NB”与“LOCK_EX”的区别是什么? – Vivek

+0

“LOCK_NB”是“非阻塞”。如果锁不可用,锁定调用立即返回false。如果没有这个,锁定调用“阻止” - 等到锁定可用时再返回。 – mob

0

从我所看到的,你有一个竞争条件。您假定孩子在父母检查句柄之前将锁定资源。使用你给出的代码,这表明只有在fork子进程的时间长度超过父进程分支为0的时间(这对我来说似乎是明智的)。除非你在父进程中强制睡眠,我没有看到你的代码和结果表明有任何问题。

+0

对不起,这是一个错误,我忘了父母的睡眠,现在编辑它。这仍然给我同样的结果。 – Vivek