这个问题实际上来自使用线程。我们知道在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()子例程。
答案 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
所以锁持续到阻止结束。