2013-02-23 52 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