threads-safe module

4 views
Skip to first unread message

Jan Seidl

unread,
Sep 23, 2010, 11:36:09 AM9/23/10
to perl_cz
Zdravim,
mam script, ktery spusti X vlaken, v hlavnim vlaknu prochazi
slozku a vklada soubory do Thread::Queue a v kazdem vlaknu si potom
vyndam polozky z te queue, dosavad nemam problem, ale dale v kazdem
vlakne tvorim objekt, ktery reperezentuje virtualni stroj a ve vlakne
pustim tento stroj no a jelikoz pusteni virtualniho stroje neni nic
jineho nez nejake davky prikazu na jistou app, tak se muze stat (a pri
spusteni se mi to v 99% stava), ze ty prikazy jdou tak rychle za sebou/
mezi sebo, ze to ta app nezvladne a spatne naskoci...

Zkousel jsem tedy vytvorit v tride pro virtualni stroj statickou
promonou, kterou jsem pomoci modulu threads::shared nasdilel a potom
ji lockovat, lec zadny uspech... Stejne tak ji nesdilet a jen
incrementovat a decrementovat a while... Nakonec se mi vse podarilo
vyresit zpusobem, ze vytvorim fajl a nakonec metody smazu fajl a pred
vytvarenim cyklim dokud nejaky fajl existuje, coz funguje, ale prijde
mi to trosku humpolacke...

Nekdo nejake napady? Me uz asi dosly...

jinak pro zhurba nacrt co si myslim ze by melo fungovat, ale nejak to
nejede (zakomentovane mam to co tam mam a funguje)

package main;
use VirtualMachine;
....
threads->create(\&process....)
....
sub process {
...
my $vm = new VirtualMachine();
...
$vm->start();
}


package VirtualMachine;
use threads::shared;

my $lock :shared = 0;
#use constant FN_LOCK => '.lock';
#unlink(FN_LOCK);

sub run {
lock($lock);
#while(-f FN_LOCK) { };
#open(LOCK,'>',FN_LOCK);
#close(LOCK);
.....samotne zpousteni
#unlink(FN_LOCK);
}

diky za jekykoliv napad na reseni, resp. kdyz to funguje, tak to je
hlavni no, ale radeji bych to resil elegantneji...

Jakub Kotrla

unread,
Sep 24, 2010, 4:14:15 AM9/24/10
to per...@googlegroups.com

Ahoj,
Netuším jak přesně funguje interně sdílení promenych, pokud vím tak perl vlákna by default nic nesdílí a vše je při startu vlákna nakopírován, je tedy možné že obrat s lock(promena) nefunguje. Nicméně přesně tohle by měl řešit tzv. Semafor, synchronizační primitivum, které je sdileno mezi vlákny a umožňuje nastavit kolik může najednou vláken jít dál.

Jakub

Dne 2010 9 23 17:36 "Jan Seidl" <unaven...@gmail.com> napsal(a):

Jan Seidl

unread,
Sep 24, 2010, 4:47:42 AM9/24/10
to perl_cz
Ahoj,
semafor jsem zkousel tez a se stejnym - tedy nefunkcnim vysledkem.
Pokud se nepletu, semafor neni nic jineho, nez sdilena promena, kterou
incrementujes ci decrementujes... Myslim si ze ten hlavni problem bude
v te "constnatni" promenne $lock - prijde mi, ze kazde vlakno si ji
inicializuje znovu ve vlastnim i kdyz to ale neni objekt jako takovy
(ten vim ze si vlakna klonuji)...

On 24 zář, 10:14, Jakub Kotrla <ja...@kotrla.net> wrote:
> Ahoj,
> Netuším jak přesně funguje interně sdílení promenych, pokud vím tak perl
> vlákna by default nic nesdílí a vše je při startu vlákna nakopírován, je
> tedy možné že obrat s lock(promena) nefunguje. Nicméně přesně tohle by měl
> řešit tzv. Semafor, synchronizační primitivum, které je sdileno mezi vlákny
> a umožňuje nastavit kolik může najednou vláken jít dál.
>
> Jakub
> Dne 2010 9 23 17:36 "Jan Seidl" <unavenslun...@gmail.com> napsal(a):
Reply all
Reply to author
Forward
0 new messages