2015-10-08 28 views
7

スレッドを使用して変数を共有する単純なスクリプトを作成しようとしていますが、この変数をスクリプト全体に対してグローバルにしたくありません。以下は簡単な例です。スレッド変数をグローバル化せずに共有する(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が" 必要で明示的なパッケージ

共有変数をレキシカルスコープにする正しい方法は何ですか?

+0

を共有変数の範囲を制限することができますグローバルではない)あなたが望むように思えるのは、あなたのスコープ用のレイヤーを作成することです。また、 'our($ val);'を使ってみましたか? – vol7ron

+1

サイドノート、 'map {$ _-> join(); }スレッド - > list(); '=>' $ _-> join()for threads-> list(); ' –

+0

@Сухой27、少しおかげでありがとう。 – tjwrona1992

答えて

4

引数を引数として渡します。

sub do_something { 
    my ($id, $lock_ref) = @_; 
    print("$id: Started\n"); 
    { 
     lock $$lock_ref; 
     print("$id: Exclusive\n"); 
     sleep(1); 
    } 
    print("$id: done.\n"); 
} 

{ 
    my $lock :shared; 
    for my $id (1..5) { 
     async { do_something($id, \$lock); }; 
    } 
} 

また、ワーカー・サブシステムだけが見ることができるようにスコープします。

{ 
    my $lock :shared; 

    sub do_something { 
     my ($id) = @_; 
     print("$id: Started\n"); 
     { 
     lock $lock; 
     print("$id: Exclusive\n"); 
     sleep(1); 
     } 
     print("$id: done.\n"); 
    } 
} 

for my $id (1..5) { 
    async { do_something($id); }; 
} 
4

あなたはそれを渡している場合を除きあなたは(どのスレッドが両方とも共有することができ、(perlはスレッドの作成前に、共有変数を見ていることを確認してください)

# .. 
{ 
    my $val:shared; 
    sub do_something { 
     my $i = shift; 
     print "Doing something with thread $i!\n"; 

     { 
      lock $val; 
      $val = "SOMETHING IS $i"; 
      print "$val\n\n"; 
     } 
    } 
} 

# Create threads 
for my $i (1 .. 5) { 
    threads->create(\&do_something, $i); 
} 

# ... 
関連する問題