スレッドを使用して変数を共有する単純なスクリプトを作成しようとしていますが、この変数をスクリプト全体に対してグローバルにしたくありません。以下は簡単な例です。スレッド変数をグローバル化せずに共有する(Perl)
use strict;
use warnings;
use threads;
use threads::shared;
my $val:shared;
# Create threads
for my $i (1 .. 5) {
threads->create(\&do_something, $i);
}
# Wait for all threads to complete
map { $_->join(); } threads->list();
# $val is global to the script so this line will work!
print "VAL IS: $val\n";
sub do_something {
my $i = shift;
print "Doing something with thread $i!\n";
{
lock $val;
$val = "SOMETHING IS $i";
print "$val\n\n";
}
}
出力:
スレッド1で何かをやって! ありがとうございます1
スレッド2で何かしている! ありがとうございます2
スレッド3で何かしている! ありがとうございます3
スレッド4で何かをやっている! ありがとうございます4
スレッド5で何かしている! SOMETHINGは5
VALは、ISを:何かが私はスクリプト全体へ
$val
にアクセスすることなく、この効果を得ることができますどのように5
IS?言い換えれば、私はどのようにしてVAL IS: $val
を印刷しようと試みることができますか?しかし、変数はスレッドによって正常に共有されますか?
私はこのようにそれを定義することはできません。
# Create threads
for my $i (1 .. 5) {
my $val:shared;
threads->create(\&do_something, $i);
}
それとも私が取得します:
グローバルシンボル "$ valが" 必要で明示的なパッケージ
共有変数をレキシカルスコープにする正しい方法は何ですか?
を共有変数の範囲を制限することができますグローバルではない)あなたが望むように思えるのは、あなたのスコープ用のレイヤーを作成することです。また、 'our($ val);'を使ってみましたか? – vol7ron
サイドノート、 'map {$ _-> join(); }スレッド - > list(); '=>' $ _-> join()for threads-> list(); ' –
@Сухой27、少しおかげでありがとう。 – tjwrona1992