2016-04-11 62 views
0

我已經使用共享的散列以下:IPC ::共享的共享

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"; 
... 

因爲應用程序可能會或可能不會simultanously運行,會不會有一個數據的損失,如果應用1和應用2試圖同時改變哈希?

回答

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; while(1) if($ handle_mem - > shlock()) { print「現在已鎖定我\ n」; $ memAAA {$ value} = $ i ++; $ handle_mem - > shunlock(); } else print「$ i:共享資源被鎖定\ n」; } }' 我將文件在多個實例中運行時使用不同的ARGV值,並且我無法擊中單個「其他」條件的情況,這是否正確,系統速度太快?或者我錯過了什麼? – Diego

+0

@Diego,是的,這是正確的。 – ikegami