3

Perlでのマルチスレッドのサポートが必要です。

基本的なロジックは、20スレッドを開始することです。配列が1つ@dataarrayあり、20チャンクのデータを各スレッドに渡す必要があります。たとえば、@dataarray200行のデータが含まれているため、最初の10行はスレッド1に送信され、次の10行はスレッド2に送信されるため、相互にデータが上書きされることはなく、最終的にスレッドの処理後に戻り結果がに更新さ@outputarrayれます。ソースと同じインデックス位置@datarray

例:行19(インデックス位置18)from@dataarrayがスレッド番号2に送信されたため、処理後にスレッド2が更新され$outputarray[18] = $processed_stringます。

配列の位置から特定のスレッドへの送信方法を理解する必要があります。

#!/usr/bin/perl

use strict;
use threads;
my $num_of_threads = 20;
my @threads = initThreads();
my @dataarray;

foreach(@threads)
    {
    $_ = threads->create(\&doOperation);
    }

foreach(@threads)
     {
     $_->join();
     }

sub initThreads
     {
       my @initThreads;
         for(my $i = 1;$i<=$num_of_threads;$i++)
         {
         push(@initThreads,$i);
     }
     return @initThreads;
     }

sub doOperation
    {
    # Get the thread id. Allows each thread to be identified.
    my $id = threads->tid();
    # Process something--- on array chunk
    print "Thread $id done!\n";
    # Exit the thread
    threads->exit();
    }
4

1 に答える 1

6

先ほどthreads::sharedを使用する必要があると言ったことは正しいとは思いません。ドキュメントを確認する必要がありましたが、よくわかりません。Perlのスレッドに関しては、私にはわかりません。

更新:結局のところ、私の不完全な理解が再び明らかになりました。少なくとも、各スレッド内からthreads::shared結果を入力できる必要があります。@output

#!/usr/bin/env perl

use strict; use warnings;
use threads;
use threads::shared;

use List::Util qw( sum );
use YAML;

use constant NUM_THREADS => 20;

my @output :shared;
my @data = ( ([1 .. 10]) x 200);

# note that you'll need different logic to handle left over
# chunks if @data is not evenly divisible by NUM_THREADS
my $chunk_size = @data / NUM_THREADS;

my @threads;

for my $chunk ( 1 .. NUM_THREADS ) {
    my $start = ($chunk - 1) * $chunk_size;
    push @threads, threads->create(
        \&doOperation,
        \@data,
        $start,
        ($start + $chunk_size - 1),
        \@output,
    );
}

$_->join for @threads;

print Dump \@output;

sub doOperation{
    my ($data, $start, $end, $output) = @_;

    my $id = threads->tid;

    print "Thread [$id] starting\n";

    for my $i ($start .. $end) {
        print "Thread [$id] processing row $i\n";
        $output->[$i] = sum @{ $data->[$i] };
        sleep 1 if 0.2 > rand;
    }

    print "Thread $id done!\n";

    return;
}

出力:

-55
-55
-55
…
-55
-55
-55
-55
于 2012-05-03T21:10:10.713 に答える