2016-04-11 2 views
0

Я общий хэш, используя следующие:IPC :: Shareable обмена

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

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

% hash1 объявлен как указано выше, в одном файле Perl, но он вызывается несколькими приложениями, каждое приложение изменяет его собственный индекс хэш:

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

при условии, что приложения могут или не могут работать одновременная установка, будет ли быть потеря данных, если Application1 и Application2 попытаться изменить хэш одновременно?

ответ

1

Вам необходимо использовать механизм блокировки. (Один предоставляется модулем.) В противном случае изменение любого значения хеша может привести к потере любого другого значения, измененного в одно и то же время. Следующая программа демонстрирует это довольно легко:

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; 
} 

запустить ее в одной консоли:

perl a.pl foo 

Затем запустите его следующим образом в другой консоли:

perl a.pl bar 
+0

Я сделал следующее испытание .pl 'my $ value = $ ARGV [0]; my $ i; в то время как (1) { if ($ handle_mem -> shlock()) { print "Теперь он заблокирован для меня \ n"; $ memAAA {$ value} = $ i ++; $ handle_mem -> shunlock(); } else { print "$ i: общий ресурс заблокирован \ n"; } } ' У меня был файл, запущенный в нескольких экземплярах с разными значениями ARGV, и я не смог попасть в один случай условия« else », это правильно и система слишком быстро? или я что-то упускаю? – Diego

+0

@ Дьего, да, это правильно. – ikegami

Смежные вопросы