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;
スレッドでデータが共有されないのはなぜですか?
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;
スレッドでデータが共有されないのはなぜですか?
変数を共有していますが、共有した変数とは異なる変数にアクセスしています。(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;
あなたは何を誤解して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;