1
use threads;
use threads::shared;

sub test {
    my $s :shared = 22;
    my $thread = threads->new(\&thrsub);

    $thread->join();
    print $s;

}

sub thrsub {
    $s = 33;
}

test;

スレッドでデータが共有されないのはなぜですか?

4

2 に答える 2

6

変数を共有していますが、共有した変数とは異なる変数にアクセスしています。(use strict;この場合、異なる変数があることをあなたに伝えているでしょう。常に を使用してくださいuse strict; use warnings;) 修正は、単一の変数を使用することです。

my $s :shared = 22;

sub test {
    my $thread = threads->new(\&thrsub);
    $thread->join();
    print $s;
}

sub thrsub {
    $s = 33;
}

test;
于 2012-06-29T18:00:24.997 に答える
4

あなたは何を誤解してthreads::sharedいます。レキシカル スコープを越えて変数にアクセスすることはできません。thrsubに影響を与えたい場合$sは、スレッドを作成するときに参照を渡す必要があります。

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

sub test {
    my $s = 22;
    my $s_ref = share $s;
    my $thread = threads->new(\&thrsub, $s_ref);

    $thread->join();
    print $s;

}

sub thrsub {
    my $s_ref = shift;
    $$s_ref = 33;
    return;
}

test;
于 2012-06-29T18:00:08.650 に答える