Explicitly decrease the priority of the current process, so that other execution threads have a better chance to execute now. Then resume normal execution and call the function busywork.
If this method succeeds, the rest of the thread's current time slice is yielded. The operating system schedules the calling thread for another time slice, according to its priority and the status of other threads that are available to run.
subbusywork{ print'busy' };
my $n = 12;
my $th_sub = sub{
my ($limit) = @_;
foreach ( 1 .. $limit ) {
print'.';
cede;
}
};
my $th = Coro->new( $th_sub, $n );
$th->ready;
foreachmy $ii ( 1 .. $n ) {
if ( $ii == int $n * 2/3 ) {
$Coro::current->prio(-1);
cede;
busywork();
}
print'-';
cede;
}
CPAN module Coro provides threading support. Here we create a thread and put it in the ready queue. The main thread prints a dash then cedes (yields) control and thread $th takes over and prints a period. This alternates back and forth until 2/3rds of the limit is reached, at which point the main thread is lowered in priority and cedes control before calling busywork(). For $n == 12 the net result is the string -.-.-.-.-.-.-......busy-----.