4

この質問は、実際にはスレッドの使用から来ています。perlスレッドにはlockという関数があり、cpan http://perldoc.perl.org/threads/shared.htmlによると:lockは、ロックがスコープ外になるまで変数にアドバイザリロックを設定します。OK、次のように書くとどうなりますか?

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()サブルーチン全体。

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 に答える