2011-11-17 70 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