1

私は元々、Thread::Queue を介してハッシュ オブジェクトを送信しようとして実験しましたが、このリンクによると、私のバージョンの Thread::Queue と threads::shared は古すぎます。残念ながら、私がテストしているシステムは私のものではないため、アップグレードできません。

次に、共通の配列を使用してハッシュを保存しようとしました。これまでのコードは次のとおりです。

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

use threads;
use Thread::Queue;
use constant NUM_WORKERS => 10;

my @out_array;
test1();

sub test1
{
    my $in_queue = Thread::Queue->new();
    foreach (1..NUM_WORKERS) {
        async {
            while (my $job = $in_queue->dequeue()) {
                test2($job);
            }
        };
    }

    my @sentiments = ("Axe Murderer", "Mauler", "Babyface", "Dragon");

    $in_queue->enqueue(@sentiments);
    $in_queue->enqueue(undef) for 1..NUM_WORKERS;
    $_->join() for threads->list();

    foreach my $element (@out_array) {
        print "element: $element\n";
    }
}

sub test2
{
    my $string = $_[0];
    my %hash = (Skeleton => $string);
    push @out_array, \%hash;
}

ただし、プロシージャの最後では、@out_array常に空です。スクリプトのスレッド部分を削除すると、@out_array正しく入力されます。ここでスレッド化を間違って実装していると思われます。

この場合、どうすれば正しく入力でき@out_arrayますか?

4

3 に答える 3