这个问题实际上来自于使用线程。我们知道,在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“语句添加了一个块,那么锁($obj)可能只是第2行,请参见我的#注释
这个问题其实是有答案的,但我想补充一些发现:
我发现不管你怎么写
lock($ojb) if threads::shared::is_shared($obj);或
if (threads::shared::is_shared($obj)) {
lock($ojb);
}锁的作用域是相同的-整个foo()子例程。
发布于 2013-02-23 20:45:10
if语句修饰符不会在其应用的语句周围放置隐式块。因此,锁的作用域(如果应用了的话)就是其余的子例程。
发布于 2013-02-23 21:12:33
根据实验结果,我发现无论你怎么写:
lock($ojb) if threads::shared::is_shared($obj);或
if (threads::shared::is_shared($obj)) {
lock($ojb);
}锁的作用域是相同的-整个foo()子例程。
发布于 2013-02-23 20:41:47
来自您在问题中链接的文档:
my $var :shared;
{
lock($var);
# $var is locked from here to the end of the block
...
}
# $var is now unlocked所以锁一直持续到街区的尽头。
https://stackoverflow.com/questions/15045402
复制相似问题