2016-04-11 5 views
0

Ich habe eine gemeinsame Hash Folgendes mit:IPC :: Gemeinsam nutzbare teilen

my $glue = 'data'; 
my %options = (
    create => 1, 
    exclusive => 0, 
    mode  => 0644, 
    destroy => 0, 
); 

tie %hash1, 'IPC::Shareable', $glue, { %options }; 

Das% hash1 erklärt, wie oben, ist in einer einzigen Datei Perl, aber es von mehreren Anwendungen aufgerufen wird, ändert jede Anwendung ihres eigener Index des Hash:

Application1 --> $hash1{app1}="alpha"; 
Application2 --> $hash1{app2}="betta"; 
... 

gegeben, dass Anwendungen oder nicht simultan ausgeführt werden können, werden es ein Datenverlust, wenn application1 und Application2 versuchen, den Hash gleichzeitig zu ändern?

Antwort

1

Sie müssen einen Verriegelungsmechanismus verwenden. (Eine davon wird vom Modul bereitgestellt.) Andernfalls kann das Ändern eines Wertes des Hash den Verlust eines anderen geänderten Wertes zur gleichen Zeit verursachen. Das folgende Programm zeigt dies ganz einfach:

use strict; 
use warnings; 

use IPC::Shareable qw(); 

my $glue = 'data'; 
my %options = (
    create => 1, 
    exclusive => 0, 
    mode  => 0644, 
    destroy => 0, 
); 

my ($key) = @ARGV 
    or die("usage\n"); 

tie(my %h, 'IPC::Shareable', $glue, \%options); 

my $c; 
while (1) { 
    $h{$key} = ++$c; 

    my $got = $h{$key}; 
    die("$key was overwritten (got $got; expected $c)\n") 
     if $got != $c; 
} 

Run es wie in einer Konsole folgt:

perl a.pl foo 

es dann laufen wie in einer anderen Konsole folgt:

perl a.pl bar 
+0

ich den folgenden Test gemacht .pl 'Mein $ Wert = $ ARGV [0]; mein $ i; while (1) { if ($ handle_mem -> shlock()) { print "Es ist jetzt für mich gesperrt \ n"; $ memAAA {$ Wert} = $ i ++; $ handle_mem -> shunlock(); } sonst { print "$ i: Die freigegebene Ressource ist gesperrt \ n"; } } ' Ich hatte die Datei in mehreren Instanzen mit unterschiedlichen ARGV-Werte ausgeführt und ich konnte nicht einen einzigen Fall der" sonst "Bedingung treffen, ist das korrekt und das System ist einfach zu schnell? oder verpasse ich etwas? – Diego

+0

@Diego, Ja, das ist richtig. – ikegami

Verwandte Themen