2014-10-28 25 views
5

Ana iş parçacığı ve çalışan iş parçacıklarında karma referansı $ref nasıl paylaşırım?Karma referansı multiithread perl ile nasıl paylaşılır?

#!/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); 
} 

cevap

5

Bu, düşünebileceğiniz kadar işe yaramıyor. threads::shared'un sınırlamalarından biri, tek boyutlu kapsayıcıları paylaşmak için iyi çalışmasıdır, ancak, iç içe geçmiş veri yapıları üzerinde çalışılmaya çalışıldığında oldukça dağınıktır, çünkü derleyici, paylaşması gerekeni 'bilmez'.

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

Yani - Yeni başlayanlar için - ilk etapta paylaşılan olarak paylaşılan değişkenleri belirlemek gerekir. Ya bildirim sırasında:

my $ref : shared; 

Ama eğer bir karma

shared_clone ($ref); 

Ama şahsen paylaşmaya çalışıyoruz olarak - Ben uzak bu tür şeylerden utangaç olur. Paylaşılan bellek nesnelerini kullanmayı sevmiyorum ve genellikle Thread::Semaphore ve Thread::Queue'u kullanmayı ve bir kuyrukta veriyi ileri ve geri aktarmayı tercih ederim., bununla büyük ölçüde yardımcı olur, freeze ve thaw, bir sıraya eklemek için bir veri nesnesi olabilir.

+0

İş parçacığı uzmanlığınızı SO'ya getirmeye devam ettiğiniz için teşekkür ederiz. Katkılarınızı takdir ediyorum. – Miller

+3

Başlıca sebebi, iş parçacığı/forking'i öğrenmeye başladım - ve bu nedenle, OO - çünkü bildiğim kadarıyla, "perl inferior" un nasıl olduğunu anladığım kadarıyla, yüksek bir at üstünde olan bütün insanları tanıyorum. – Sobrique

İlgili konular