I have this script that is using threads, queues and a shared variable. once the queue is empty, i have a few threads that hang, and hence the program never finishes.
the script is actually quite simple, reading from a file (which happens to be IP addresses) queuing said data, then in each thread, dequeuing an ip address and doing an snmpget on it.
i can help but think i'm missing something fundamental here.
#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;
use Thread::Queue;
my $q = new Thread::Queue; # create empty threaded queue
my $threadcount = 10; # amount of threads
my @SNMPthreads; # thread tracker
my @firmware : shared;
open (FH, 'filename.txt');
while (<FH>) {
chomp;
$q->enqueue($_);
}
close FH;
foreach my $i (1..$threadcount) {
push @SNMPthreads, threads->new(\&SNMPthread, $i );
}
foreach my $i (0..$#SNMPthreads) {
my $retval = $SNMPthreads[$i]->join();
}
open (WH, ">firmware.txt");
print WH "-->$_\n" foreach @firmware;
close WH;
sub SNMPthread {
my $thread = shift;
while ( $q->pending && $q->pending > 0) {
my $left = $q->pending;
my $ip = $q->dequeue;
push @firmware, "$$: $thread, $left, $ip";
my $retval = `/usr/bin/snmpget -v1 -c <commstring> $ip sysDesc
+r.0`;
chomp $retval;
$retval =~ s/\>\>//g;
my @ele = split(/\;/, $retval);
print "$ip, $ele[ ($#ele-1) ], $ele[ $#ele ]\n";
}
print "thread $thread finished\n";
}
top complete the picture on the environment i'm in:
Summary of my perl5 (revision 5 version 8 subversion 7) configuration:
Platform:
osname=linux, osvers=2.6.14.3, archname=i486-linux-gnu-thread-mult
+i
uname='linux ninsei 2.6.14.3 #1 smp preempt mon nov 28 19:51:50 ps
+t 2005 i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dccc
+dlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/
+share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 -Dvendorprefix=/usr -Dvend
+orlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/
+local -Dsitelib=/usr/local/share/perl/5.8.7 -Dsitearch=/usr/local/lib
+/perl/5.8.7 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/ma
+n3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man
+3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -
+Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dlibperl=libperl.so.5.8.7 -Dd_
+dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define usemulti
+plicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
+-DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE
+_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
+-fno-strict-aliasing -pipe -I/usr/local/include'
ccversion='', gccversion='4.0.3 20051201 (prerelease) (Debian 4.0.
+2-5)', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=1
+2
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
+ lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.3.5.so, so=so, useshrplib=true, libperl=libperl.s
+o.5.8.7
gnulibc_version='2.3.5'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'
Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY USE_ITHREADS USE_LARGE_FILES
PERL_IMPLICIT_CONTEXT
Locally applied patches:
SPRINTF0 - fixes for sprintf formatting issues - CVE-2005-3962
Built under linux
Compiled at Dec 15 2005 17:19:17
@INC:
/etc/perl
/usr/local/lib/perl/5.8.7
/usr/local/share/perl/5.8.7
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
and uname shows:
2.6.11.7-ibm26 #1 SMP The machine is a quadcore intel jobby.
is anyone able to offer advice on this hangage ?
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.