On Wed, 19 Apr 2006, Daniel Rychlik wrote:
> Some of you have asked for code examples.
>
> One of issues that I am having is when the thread enters into
> getAvailableResource routine its not seeing that the
> $Resources{'WAN1'}->{INUSE} = 1; has been made unavailable. The idea is
> for the next thread to pick up the next unavailable resource. I tried
> to sleep(1) between thread creation, and also used threads::shared
> share(%Resources); which also failed.
Dan,
A few quick remarks/suggestions.
First, please post the smallest possible code that reproduces your symptoms:
pare down your problematic program, stuff it with stubs until you've got a
cogent proof-of-problem.
Second, &share()ing your hash clears it [0], so populate it /after/ you mark
it shared. Additionally, the hash members themselves have to be explicitly
shared, IIUC. [1]
Third, your 'INUSE' check looks to have a race. You'll need to &lock(), use
a semaphore, etc. As others have suggested, Thread::Queue makes these kinds
of problems a lot easier. You could, perhaps, manage the "wan" and "modem"
resources themselves in a queue -- pop off the next available one, use it,
then re-queue it for another job later on. TMTOWTDI.
[0] "When share is used on arrays, hashes, array refs or hash refs, any
data they contain will be lost."
http://search.cpan.org/~jdhedden/threads-shared-1.01/shared.pm#BUGS_AND_LIMITATIONS
[1] "This places restrictions on what may be assigned to shared array and
hash elements: only simple values or references to shared variables are
allowed..."
http://www.perldoc.com/perl5.8.4/pod/perlthrtut.html#Shared-And-Unshared-Data
Good luck,
Mike
--
cat: .signature: Message too long