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


in reply to Re^3: Is it possible to create a single Hash-of-Hash.. with multiple threads..
in thread Is it possible to create a single Hash-of-Hash.. with multiple threads..

Dear Monk BrowserUk! Please take a bow!!

Thank You so much - for enlightening me :) Indeed - it was my lack of understanding.

I have found this entire discussion from everybody - very helpful.

-=-=-=-=-=-=-=-

Now, I need more :) It seems - me and my code is tired of doing so many .. if exists.. else share.. kinda additives before I do any structure change - and I think no way to avoid that. Now a couple of Questions here:

Q1. Is there any easier method?

Q2. Is it possible to grow a local tree or branch data-structure, then create a shared_clone - and graft the new tree to s sub-branch of main shared tree?

Q3. I have few subroutines to be called many times - based on data - from inside my thread_worker. So far I am lacking depth in understanding or visualizing - how/when multiple threads work on different set of data, while calling a subroutine - does the code-inside-subroutine-block gets a replicated inside the thread uniquely? - else how the sanity is retained? - sorry if I am asking too basic question - maybe it is the case, I am confused - and not clear enough - where is my confusion too..

Q4. Inside subroutine - do I have to use every variable as local and not-shared?

Thanks a lot! Again & Again!

  • Comment on Re^4: Is it possible to create a single Hash-of-Hash.. with multiple threads..

Replies are listed 'Best First'.
Re^5: Is it possible to create a single Hash-of-Hash.. with multiple threads..
by BrowserUk (Patriarch) on May 03, 2014 at 07:46 UTC

    1. No.

      You can replace:

      if( exists $copyRef->{ $step } ) { $copyRef = $copyRef->{ $step }; } else { lock %{ $copyRef }; $copyRef = $copyRef->{ $step } = &share( {} ); }

      With:

      lock %{ $copyRef }; $copyRef = $copyRef->{ $step } //= &share( {} )

      Which is more compact, but not easier nor more efficient.

    2. Yes.

      Two possibilities:

      1. You can build a normal (non-shared) subhash and when complete, use threads::shared::shared_clone() to make a shared copy of it and assign a reference to the copy to a key/value pair in the main shared hash:
        ... my %subhash; ... # populate it lock %mainSharedHash; $mainSharedHash{ $key } = shared_clone( \%subhash ); ...
      2. You can create a shared subhash and assign a ref to it without needing to copy:
        ... my %subhash :shared: ... # populate it lock %mainSharedHash; $mainSharedHash{ $key } = \%subhash;
    3. I do not understand the question.

      You'll get better answers if you describe your actual application. Ie. Real requirements garner working responses.

    4. Again, your question makes no sense.

      In a subroutine (or anywhere else), you can use unshared variables and/or shared variables as required.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.