Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > Checking thread status

Reply
Thread Tools

Checking thread status

 
 
programmacist@yahoo.com
Guest
Posts: n/a
 
      08-05-2005
Hello,

I'm trying to accomplish something that seems, IMHO, like it should be
relatively straightforward, but I can't seem to figure it out. I create
a worker thread that goes off and processes for an extended period of
time. Meanwhile, I would like to continue processing in the main
thread, and periodically check whether the worker thread is finished.
The example below illustrates this:

use threads;

sub work {
print "Worker has started\n";
sleep (3);
die "Worker is finished\n";
}

my $worker = threads->create('work');

while (** worker is not done **) {
print "Main is performing a task\n";
sleep (1);
}

$worker->join();

print "Moving on...\n";

What I can't seem to figure out is how to accomplish the ** worker is
not done ** part.

I have tried using threads->list to see the number of running threads,
but this continues to show the worker, even after it has supposedly
ended.

I have also tried the deprecated Thread module, so I could look at
$worker->done. However, it too, continues to say that the worker is not
done.

I thought about using a shared variable as a flag, but this doesn't
allow for the case of an abnormally terminated worker thread.

One clue I may have is that the output includes the following:

thread failed to start: Worker is finished

when the worker thread dies. I'm wondering why it thinks that the
thread didn't start?

I am using ActiveState perl 5.8.6 on a WindowsXP machine, though I've
also tried it on Windows 2000.

Any help provided would be greatly appreciated!

Cheers,
Ralph

 
Reply With Quote
 
 
 
 
Tassilo v. Parseval
Guest
Posts: n/a
 
      08-05-2005
Also sprach http://www.velocityreviews.com/forums/(E-Mail Removed):

> I'm trying to accomplish something that seems, IMHO, like it should be
> relatively straightforward, but I can't seem to figure it out. I create
> a worker thread that goes off and processes for an extended period of
> time. Meanwhile, I would like to continue processing in the main
> thread, and periodically check whether the worker thread is finished.
> The example below illustrates this:
>
> use threads;
>
> sub work {
> print "Worker has started\n";
> sleep (3);
> die "Worker is finished\n";
> }
>
> my $worker = threads->create('work');
>
> while (** worker is not done **) {
> print "Main is performing a task\n";
> sleep (1);
> }
>
> $worker->join();
>
> print "Moving on...\n";
>
> What I can't seem to figure out is how to accomplish the ** worker is
> not done ** part.
>
> I have tried using threads->list to see the number of running threads,
> but this continues to show the worker, even after it has supposedly
> ended.
>
> I have also tried the deprecated Thread module, so I could look at
> $worker->done. However, it too, continues to say that the worker is not
> done.


Note what the documention of 'Thread' says on 'done':

done The "done" method returns true if the thread you're
checking has finished, and false otherwise. (Not avail-
able with ithreads.)

Since 'use threads' is using the ithreads-model, you're out of luck.

> I thought about using a shared variable as a flag, but this doesn't
> allow for the case of an abnormally terminated worker thread.


You can still cover that case by installing a handler for the
pseudosignal __DIE__ in your worker thread:

use threads;
use threads::shared;

my $working : shared;

sub work {
local $SIG{__DIE__} = sub {
print "Abnormal termination: ", shift;
$working = 0;
};
print "Worker has started\n";
sleep (3);
die "died\n" if rand > 0;
$working = 0;
}

$working = 1;
my $worker = threads->create('work');

while ($working) {
print "Main is performing a task\n";
sleep (1);
}

$worker->join();

print "Moving on...\n";

So now your worker thread will set $working to zero even under some
abnormal condition that would have normally caused an imediate death.

> One clue I may have is that the output includes the following:
>
> thread failed to start: Worker is finished
>
> when the worker thread dies. I'm wondering why it thinks that the
> thread didn't start?


This warning is a little misleading. perldiag says:

thread failed to start: %s
(F) The entry point function of threads->create() failed for
some reason.

'work' is your entry point function and having it die satisfies the
condition for "failed for some reason", I reckon.

Contrary to what perldiag thinks (the (F) indicates it's a fatal
trappable error), this is merely a warning and it can be shut up by
installing a handler for __WARN__.

Tassilo
--
use bigint;
$n=71423350343770280161397026330337371139054411854 220053437565440;
$m=-8,;;$_=$n&(0xff)<<$m,,$_>>=$m,,print+chr,,while(($ m+=<=200);
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
can I use more than one status condition name in imaplib.status() harryos Python 0 10-13-2010 01:37 PM
how can a child thread notify a parent thread its status? scriptlearner@gmail.com Python 9 07-26-2009 11:50 AM
Recommend a free 'Status Monitor' or 'Dashboard' to report overnight tasks status? Shug Java 13 12-15-2006 06:22 PM
Recommend a free 'Status Monitor' or 'Dashboard' to report overnight tasks status? Shug C++ 13 12-15-2006 06:22 PM
POST problem - IIS sc-win32-status:64; sc-status:400 saha ASP .Net 0 07-14-2005 07:10 AM



Advertisments