4

这个问题实际上来自使用线程。我们知道,在 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 "if" 语句添加一个块,然后 lock($obj) 可能只是第 2 行,请参阅我的 #comments


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

我发现无论你怎么写:

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

或者

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

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

4

3 回答 3

7

if语句修饰符不会在它适用的语句周围放置隐式块。所以锁的范围(如果它被应用的话)就是你的子程序的整个其余部分。

于 2013-02-23T20:45:10.623 回答
0

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

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

或者

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

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

于 2013-02-23T21:12:33.787 回答
-2

从您在问题中链接的文档中:

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

所以锁一直持续到块的末尾。

于 2013-02-23T20:41:47.457 回答