1

スレッドで perl を使用してソケット情報を処理しています

ConnectionThread は、パケットの受信と解析、およびハッシュのエンキューを担当します。

QueueThread は、Queue elelemts (ハッシュ エントリ) の処理と DB の更新を担当します。

ハッシュはイベントであり、私の %Events:shared;として宣言されています。

スレッドにハッシュ参照を渡していますが、各スレッドが異なるハッシュ参照値を取得していることに気付きました

my $hash_ref1 = \%Events ; # referencing
print "Hash ref in main is 1 " . $hash_ref1 ."\n";
my $thr1 = threads->create(\&ConnectionThread, $hash_ref1 );
my $thr2 = threads->create(\&QueueThread, $hash_ref1);

出力は以下のとおりです

Hash ref in main is 1 HASH(0x825faa4)
Hash ref is ConnectionThread is HASH(0x8493544)
Thread started ..
Hash ref is Queue thread is HASH(0x852dd9c)

以下は完全なコードです(説明用)

use strict;
use warnings;
use Socket;
use threads;
use threads::shared;
use DBI;
my %Events:shared;

sub checkSize {
    my $size;
    $size =keys %Events;
    print "Size of Queue in Check is ***" .$size ." \n";
}

sub QueueThread {
    my ($hash_ref) = @_;
    print "Hash ref is Queue thread is " . $hash_ref ." \n";
    while (1==1) {
        sleep (5);
    }
}

sub ConnectionThread {
    my ( $hash_ref ) = @_;
    print "Hash ref is ConnectionThread is " . $hash_ref ." \n";
    while (1==1) {
        sleep(5);
    }
}

my $hash_ref1 = \%Events;
print "Hash ref in main is 1 " . $hash_ref1 ."\n";
my $thr1 = threads->create(\&ConnectionThread, $hash_ref1 );
my $thr2 = threads->create(\&QueueThread, $hash_ref1);
print "Thread started ..\n";
while (1==1) {
    sleep 10;
}
4

2 に答える 2

1

すべてのスレッドで同じ変数に直接アクセスしているわけではありません。もしそうなら、プログラムのクラッシュを避けるために、変数にアクセスするたびに(変数を読み取るためであっても)変数への相互アクセスを明示的に保証する必要があります。

各スレッド (変数が作成されるスレッドを含む) は、データを含む変数への「プロキシ」を取得します。プロキシは魔法の変数です。つまり、プロキシの要素にアクセスすると、ゲッターとセッターが呼び出されます。これらのゲッターとセッターは、相互に排他的なアクセスを提供することで、データを含む変数が矛盾した状態にならないようにします。

$ perl -Mthreads -Mthreads::shared -MDevel::Peek \
   -E'my %h :shared; ( async { Dump(%h); } )->join; Dump(%h);' 2>&1 |
      grep -P '^\S|^ {8}IV'
SV = PVHV(0x1ed5f90) at 0x1f6fd68   <-----+
        IV = 31930352               <--+  |
SV = PVHV(0x1d70af0) at 0x1d880d0   <--|--+------ Two different vars
        IV = 31930352               <--+--------- Proxying the same var (0x1e737f0)
于 2015-04-12T17:22:37.960 に答える