Есть ли способ разбудить спящий поток, используя его идентификатор в Perl? Заранее спасибо
Ниже приведено то, что я пробовал с помощью приостановки и возобновления
use warnings;
use strict;
use threads;
use threads::shared;
use Thread::Suspend;
my $val:shared = 0;
my $count = 0;
while ( $count < 4 )
{
my $thr = threads->create( \&worker );
$count++;
}
use Tk;
my $mw = MainWindow->new();
$mw->protocol('WM_DELETE_WINDOW' => sub { &clean_exit });
my $thr;
my $button;
$button = $mw->Button(
-text => 'Invoke thread',
-command => sub{
$val += 1;
if( $val > 4)
{
$val = 1;
}
foreach $thr (threads->list())
{
if( $thr->tid() == $val )
{
$thr->resume();
goto OUTSIDE;
}
}
OUTSIDE:
})->pack();
MainLoop;
sub clean_exit
{
my @running_threads = threads->list;
if (scalar(@running_threads) < 1)
{
print "\nFinished\n";
exit;
}
else
{
foreach my $thr (threads->list())
{
$thr->kill('KILL')->detach();
}
exit;
}
}
sub worker
{
$SIG{'KILL'} = sub { threads->exit(); };
threads->suspend();
print threads->tid()."\n";
}
То, что я пытаюсь сделать, - это когда пользователь нажимает кнопку Invoke, он должен возобновить поток на основе $ val. Но это не работает таким образом. Первый поток с идентификатором 4 - это возобновление после 4 нажатий вместо 1. Пожалуйста, помогите в отладке кода. Постскриптум Я новичок в Perl