当“if”写在perl的行尾时,它的范围是什么

时间:2013-02-23 20:38:33

标签: multithreading perl locking

这个问题实际上来自使用线程。我们知道在perl线程中,我们有一个名为lock的函数,并且根据cpan http://perldoc.perl.org/threads/shared.html:lock在变量上放置一个建议锁,直到锁超出范围。好的,如果我们写这样的东西怎么办:

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”语句向其添加一个块,那么lock($ obj)可能只是第2行,请参阅我的#comments


问题实际上得到了回答,但我想补充一些发现:

我发现无论你怎么写:

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

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

锁的范围是相同的 - 整个foo()子例程。

3 个答案:

答案 0 :(得分:7)

if语句修饰符不会在它应用的语句周围放置一个隐式块。因此,锁定的范围(如果应用)是整个子程序的其余部分。

答案 1 :(得分:0)

根据实验结果,我发现无论你怎么写:

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

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

锁的范围是相同的 - 整个foo()子例程。

答案 2 :(得分:-2)

来自您在问题中链接的document

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

所以锁持续到阻止结束。