http://www.perlmonks.org?node_id=1011122

ISAI student has asked for the wisdom of the Perl Monks concerning the following question:

Hello all. I am trying to do the following: I have a shared hash, namely %hash1 I initiate a lock. The I call for a function on a particular key, and assign the function value to the key. Is the lock still on? I could not find an answer to it, and the documentation I have found on perldoc does not cover that angle.

See code:
use strict ; use threads ; use threads::shared ; my %hash1 =(1,2, 3,4) ; { lock (%hash1) ; $hash1{1} = foo ($hash1{1}); $hash1{3} = foo ($hash1{3}) }

My question is: Is the advisory lock active when $hash{3} is accessed and assigned, or is calling foo removes the lock (because of use strict and the scoping limitation? )Trying to test it may be tricky, and I am not sure if I know how to cover most angles. Using foo to lock the variable is useless, and passing it a reference to the hash, and then locking, may cause deadlocks.

Replies are listed 'Best First'.
Re: advisory lock status when calling a function, with use strict
by Anonymous Monk on Jan 01, 2013 at 07:21 UTC

    I don't know anything about lock, but I do know that there is no way strict would have anything to do with lock

    In the code you've shown you only have the main thread, so lock is irrelevant

    Yes, the lock is still on for the duration of the scope, the documentation is clear about this , threads::shared#lock

      After reading for the 10th time, I have the answer (although not a direct one): "calls to lock by the same thread from within dynamically nested scopes are safe -- the variable will remain locked until the outermost lock on the variable goes out of scope." The answer is yes.
Re: advisory lock status when calling a function, with use strict
by mhearse (Chaplain) on Jan 01, 2013 at 17:48 UTC