Om een applicatie te multithreaden, moet ik een verschillende threads toelaten om van eenzelfde klasse gebruik te maken. Om het concreet te maken: het gaat om verschillende download threads, die van een proxy manager een proxy url moeten ophalen.
Om dat te verwezenlijken, heb ik een Proxy klasse gemaakt, waarvan de objecten via functies (get, remove, blabla) proxies kunnen ophalen en verwijderen uit een statisch gedeelde proxy cache. Om problemen te vermijden, zijn die lees en schrijf acties van de lokale cache beschermd door een gedeelde semafoor ("$s : shared = Thread::Semaphore->new()"). Het lukt me echter niet om de cache van proxies, het statische element waartoe alle instanties van Proxy toegang moeten toe hebben, te delen. Het is onmogelijk via "threads::shared", aangezien het een complex object is (de variabele als ":shared" declareren zoals de semafoor werkt enkel als het een array/hash/scalar is zonder nested items).
Ik had zelf op twee methodes gekomen, die elk echter niet voldoen. De eerste:
waarbij $test de gedeelde datastructuur voorstelt. De manier van delen werkt aangezien %shared een enkel gelaagde hash is (perfect te delen via :shared dus), maar de consequentie is dat die hash enkel scalars, of shared references mag bevatten. Zo een shared reference maak ik aan via de share() functie, maar hierdoor wordt mijn $test object gewist! Alle data die voorheen via new() aangemaakt is, wordt gewist... Hoe los ik dit op?
De tweede opzet die ik op internet tegen gekomen was, is:
Waarbij ik in elke thread test dan derefereer via deref(). Niet echt Perl-ish, en Devel::Pointer blijkt niet eens beschikbaar te zijn bij de meeste distro's...
Iemand enig idee hoe ik een dergelijk object deel, hetzij door er een correcte shareable reference van te maken, hetzij op een andere manier? Alvast bedankt!
Om dat te verwezenlijken, heb ik een Proxy klasse gemaakt, waarvan de objecten via functies (get, remove, blabla) proxies kunnen ophalen en verwijderen uit een statisch gedeelde proxy cache. Om problemen te vermijden, zijn die lees en schrijf acties van de lokale cache beschermd door een gedeelde semafoor ("$s : shared = Thread::Semaphore->new()"). Het lukt me echter niet om de cache van proxies, het statische element waartoe alle instanties van Proxy toegang moeten toe hebben, te delen. Het is onmogelijk via "threads::shared", aangezien het een complex object is (de variabele als ":shared" declareren zoals de semafoor werkt enkel als het een array/hash/scalar is zonder nested items).
Ik had zelf op twee methodes gekomen, die elk echter niet voldoen. De eerste:
Perl:
1
2
3
4
5
| my $test = new Test(); my %shared : shared = ( test => &share($test), ); |
waarbij $test de gedeelde datastructuur voorstelt. De manier van delen werkt aangezien %shared een enkel gelaagde hash is (perfect te delen via :shared dus), maar de consequentie is dat die hash enkel scalars, of shared references mag bevatten. Zo een shared reference maak ik aan via de share() functie, maar hierdoor wordt mijn $test object gewist! Alle data die voorheen via new() aangemaakt is, wordt gewist... Hoe los ik dit op?
De tweede opzet die ik op internet tegen gekomen was, is:
Perl:
1
2
3
4
| my $test = new Test(); my %shared : shared = ( test => address_of($test), ); |
Waarbij ik in elke thread test dan derefereer via deref(). Niet echt Perl-ish, en Devel::Pointer blijkt niet eens beschikbaar te zijn bij de meeste distro's...
Iemand enig idee hoe ik een dergelijk object deel, hetzij door er een correcte shareable reference van te maken, hetzij op een andere manier? Alvast bedankt!