Hallo Forumsgemeinde,
ausnahmsweise muss ich mich mal wieder selbst darum kümmern, dass ein atomares (nicht mehr teilbares) Locking tut (in PERL).
Praktisch soll es so sein, dass jeder Prozess, der einen Record schreibt, ein Lock setzt und diesen Lock am Ende auch wieder aufhebt. Wenn ein Lock gesetzt ist (hier in einem hash, der mit DB_File gebunden, einem jeden Prozess zur Verfügung steht), soll der Prozess in eine Warteschleife gehen und erst dann weitermachen, wenn der andere Prozess den Lock aufgehoben hat.
Problematisch sind deadlocks, also Locks die hängengeblieben sind, falls mal ein Prozess vorzeitig abgebrochen wurde und nicht mehr dazukam, einen Lock aufzuheben.
Ich denke, das könnte so gehen, dass ich, im Falle eines Locks den Prozess in eine Queue schicke und max. 1 Mio mal schaue ob der Lock noch steht. Ist der Lock vorher wech - ok. Ansonsten wird nach 1 Mio Versuchen der Lock neu gesetzt.
Was meint den Ihr - Hat jemand Erfahrung mit solchen Dingen, insbesondere mit den zu erwartenden Prozesszeiten | Versuchen in der Queue - hinsichtlich eines deadlocks?
Viele Grüße, Rolf
lock - unlock
sub trylock{
my $att;
while( $lockdb{'lock'} ){ # gehen in die Warteschleife wenn ein lock gesetzt ist...
$att++;
last if $att == 1_000_000; # An dieser Stelle steht fest, dass es ein deadlock ist vom Vorgänger
}
$lockdb{'lock'} = 1; # selbst ein lock setzen, egal ob vorher die Schleife durchlaufen wurde
return;
}