2014-10-28 9 views
5

Jak udostępnić skrót hashowy $ref w wątku głównym i wątkach roboczych?Jak udostępnić odwołanie do hasza w wątku wielowątkowym?

#!/usr/bin/perl 
use strict; 
use warnings; 

use threads; 
use threads::shared; 

my $ref = {}; 
$ref->{0}->{abc} = 123; 
$ref->{1}->{abc} = 223; 

printf("%d\n", $ref->{0}->{abc}); 
printf("%d\n", $ref->{1}->{abc}); 

issue_all_jobs($ref); 

while (1) 
{ 
    printf("%d\n", $ref->{0}->{abc}); 
    printf("%d\n", $ref->{1}->{abc}); 
    sleep(1); 
} 

sub issue_all_jobs 
{ 
    my ($ref) = @_; 
    for (my $i = 0; $i < 2; $i++) 
    { 
     $ref->{$i}->{handle} = new threads(\&issue_job, $ref, $i); 
     $ref->{$i}->{handle}->detach(); 
    } 
} 

sub issue_job 
{ 
    my ($ref, $i) = @_; 
    $ref->{$i}->{abc} = 555123 + $i; 
    sleep(2); 
} 

Odpowiedz

5

To nie działa tak dobrze, jak mogłoby się wydawać. Jednym z ograniczeń threads::shared jest to, że działa dobrze w celu współużytkowania kontenerów jednowymiarowych, ale staje się raczej niechlujny, gdy próbuje pracować w zagnieżdżonych strukturach danych, ponieważ kompilator nie "wie", co należy udostępnić.

http://perldoc.perl.org/threads/shared.html#BUGS-AND-LIMITATIONS

Więc - na początek - trzeba wyznaczyć udostępnionych zmiennych jak dzielone w pierwszej kolejności. Albo w deklaracji:

my $ref : shared; 

Ale jak starasz się dzielić hash

shared_clone ($ref); 

Ale osobiście - będę uciekać od takich rzeczy. Nie lubię korzystać z obiektów pamięci współużytkowanej i generalnie wolę używać Thread::Semaphore i Thread::Queue i przekazywać dane tam iz powrotem w kolejce. Storable bardzo pomaga w tym, ponieważ można freeze i thaw obiektu danych do wstawienia do kolejki.

+0

Dziękujemy, że nadal przekazujesz swoje doświadczenie w zakresie gwintowania. Doceniam twój wkład. – Miller

+3

Głównym powodem, dla którego zacząłem uczyć się gwintowania/rozwidlania - i o to chodzi, OO - jest to, że sprawia, że ​​wszyscy ludzie, których znam na wysokim koniu, że "perl jest gorszy" wyglądają na trochę chorych, kiedy to sugeruję. – Sobrique

Powiązane problemy