Thanks,

I'll try these ideas.  

My programs are in no way going into production :).  These are just
exercises so that I can understand how threads work in Perl.  I
appreciate the help.  

I think my next exercise will be a bit harder.  I'm going to take a
program I've done in threads in C and convert to Perl.  It is a device
monitor that uses simple ping to make sure devices are up.  There is 1
thread that walks through the list of objects doing notification
(email).  There is a thread for each IP address.  The whole idea of
doing it in threads is so that we can guarantee that every 60 seconds we
ping a host.  If we simply walked through a list a couple of unreachable
addresses could throw that guarantee out the window.  In the C version I
created a linked list of objects.  Each thread worked on one object and
the notification thread simply walked that list looking for things to
act on.  Hopefully I can get the Perl program to do the same thing :)



On Tue, 2006-10-10 at 10:25 -0700, Dean Arnold wrote:
> Dean Arnold wrote:
> > Christopher Fowler wrote:
> >> On Tue, 2006-10-10 at 09:23 -0500, Michael J. Pomraning wrote:
> > 
> > I've done a quick rewrite of your example (note I have no idea what
> > the function of your script is, but the Packet class is a pretty simple 
> > container
> > class, so hopefully this captures what you're attempting).
> 
> Big OOOPS on my part. I forgot one little detail: you have to rebless
> the object when its dequeue'd:
> 
> > 
> > sub process_thread {
> >     while(1) {
> > 
> > #
> > #    wait for a packet (or for 'DIE')
> > #
> >         my $pktobj = $q->dequeue();
> > #
> > #    if not a ref, then it must be 'DIE'
> > #
> >         return 1
> >             unless ref $pktobj;
> 
> #
> #     You have to rebless in the receiving thread
> #
>       bless $pktobj, 'Packet';
> > #
> > # Get the packet off the list and unpack the time
> > #
> >         my $pkt = $pktobj->get_packet();
> >         my $ti = $pktobj->get_timestamp();
> 
> FWIW (and blatant plug): if your Packet class becomes more complex, esp.
> if it has object refs or file handles as members,
> you might check out Thread::Queue::Duplex, which provides a
> Thread::Queue::Queueable base class which your Packet class can subclass
> to implement its own marshalling/unmarshalling (aka curse()/redeem())
> methods to deal with recovering things.
> 
> Dean Arnold
> Presicient Corp.

Reply via email to