2013-02-23 58 views
4

這個問題實際上來自使用線程。我們知道在perl線程中,我們有一個叫lock的函數,根據cpan http://perldoc.perl.org/threads/shared.html:lock將一個顧問鎖放在變量上,直到鎖超出範圍。好吧,如果我們寫這樣的東西:當「if」寫在perl的行尾時,它的範圍是什麼

1 sub foo{ 
2 lock($obj) if threads::shared::is_shared($obj); #equivalent to if(threads::shared::is_shared($obj)) {lock($obj);} ? 
3 ... rest of the code 
4 ... more code 
5 } 

所以鎖的範圍是從第2行到第4行或只是第2行?如果「if」語句添加到它的塊,然後鎖定($ OBJ)也許只是2號線,看到我#comments


的問題實際上是回答,但我想補充一些發現:

我發現不管你怎麼寫兩種:

lock($ojb) if threads::shared::is_shared($obj); 

if (threads::shared::is_shared($obj)) { 
    lock($ojb); 
} 

鎖的範圍是相同的 - 整個foo()子例程。

回答

7

if語句修飾符不會在它適用的語句周圍放置一個隱含塊。所以鎖的範圍(如果它被應用)是你的子程序的其餘部分。

-2

從問題非常document您鏈接:

my $var :shared; 
    { 
     lock($var); 
     # $var is locked from here to the end of the block 
     ... 
    } 
    # $var is now unlocked 

所以鎖會持續到塊結束。

+0

嗨如果它相當於if(threads :: shared :: is_shared($ obj)){lock($ obj);}那麼範圍在if中。 – 2013-02-23 20:43:22

+0

我明白你在問什麼:)看起來像鮑羅丁回答你的問題。 – Andomar 2013-02-23 20:46:20

+1

@Andomar:我想你錯過了這一點。 OP想要知道'if'語句修飾符是否像'if(CONDITION)BLOCK'語句一樣限制了鎖的範圍。 – Borodin 2013-02-23 20:48:15

0

根據試驗結果,我發現不管你怎麼寫兩種:

lock($ojb) if threads::shared::is_shared($obj); 

if (threads::shared::is_shared($obj)) { 
    lock($ojb); 
} 

鎖定的範圍是各項─全富()子程序。

+0

這不是事實。鎖只會阻塞,直到詞法作用域的結束,在第二種情況下,它將在獲得鎖後立即結束。 – ikegami 2013-02-24 08:17:28

相關問題