Thread::Cancel - Cancel (i.e., kill) threads


Thread-Cancel documentation Contained in the Thread-Cancel distribution.

Index


Code Index:

NAME

Top

Thread::Cancel - Cancel (i.e., kill) threads

VERSION

Top

This document describes Thread::Cancel version 1.13

SYNOPSIS

Top

    use Thread::Cancel 'SIGUSR1';      # Set the cancellation signal
    use Thread::Cancel;                #  Defaults to 'KILL'

    $thr->cancel();                    # Cancel a thread
    threads->cancel();                 # Cancel all non-detached threads
    threads->cancel($thr, $tid, ...);  # Cancel multiple threads using
                                        #   objects or TIDs

DESCRIPTION

Top

This module adds cancellation capabilities for threads. Cancelled threads are terminated using threads->exit(). The thread is then detached, and hence automatically cleaned up.

Threads that are suspended using Thread::Suspend do not need to be resumed in order to be cancelled.

It is possible for a thread to cancel itself.

Declaration

This module must be imported prior to any threads being created.

Cancellation is accomplished via a signal handler which is used by all threads on which cancel operations are performed. The signal for this operation can be specified when this module is declared, and defaults to SIGKILL. Consequently, the application and its threads must not specify some other handler for use with the cancel signal.

use Thread::Cancel;

Declares this module, and defaults to using SIGKILL for cancel operations.

use Thread::Cancel 'SIGUSR1';
use Thread::Cancel 'Signal' => 11;

Declares this module, and uses the specified signal for cancel operations. Signals may be specified by the same names or (positive) numbers as supported by kill() ("kill SIGNAL, LIST" in perlfunc).

Methods

$thr->cancel()

Cancels the threads.

threads->cancel()

Cancels all non-detached threads. This offers a clean way to exit a threaded application:

    # Terminate all threads and exit
    threads->cancel();
    exit(0);

threads->cancel($thr, $tid, ...)

Cancels the threads specified by their objects or TIDs (for non-detached threads).

CAVEATS

Top

Subject to the limitations of "THREAD SIGNALLING" in threads.

Cancelled threads are automatically detached, so do not try to ->join() or ->detach() a cancelled thread.

Detached threads can only be cancelled using their threads object:

    $thr->detach();
    $thr->cancel();
    # or
    threads->cancel($thr);

Threads that have finished execution are, for the most part, ignored by this module.

REQUIREMENTS

Top

Perl 5.8.0 or later

threads 1.39 or later

Test::More 0.50 or later (for installation)

SEE ALSO

Top

Thread::Cancel Discussion Forum on CPAN: http://www.cpanforum.com/dist/Thread-Cancel

threads, threads::shared

AUTHOR

Top

Jerry D. Hedden, <jdhedden AT cpan DOT org>

COPYRIGHT AND LICENSE

Top


Thread-Cancel documentation Contained in the Thread-Cancel distribution.

package Thread::Cancel; {

use strict;
use warnings;

our $VERSION = '1.13';

use threads 1.39;

my $SIGNAL = 'KILL';    # Default cancellation signal

sub import
{
    my $class = shift;   # Not used

    # Set the signal for cancel operations
    while (my $sig = shift) {
        $SIGNAL = $sig;
    }
    $SIGNAL =~ s/^SIG//;

    # Set up the cancel signal handler
    $SIG{$SIGNAL} = sub { threads->exit(); };
}


sub threads::cancel
{
    my ($class, @threads) = @_;

    if ($class eq 'threads') {
        if (@threads) {
            # Cancel specified list of threads
            @threads = grep { $_ }
                       map  { (ref($_) eq 'threads')
                                    ? $_
                                    : threads->object($_) }
                            @threads;
        } else {
            # Cancel all threads
            push(@threads, threads->list());
        }
    } else {
        # Cancel a single thread
        push(@threads, $class);
    }

    # Cancel threads
    my $resumable = threads->can('resume');
    foreach my $thr (@threads) {
        $thr->detach() if (! $thr->is_detached());
        $thr->kill($SIGNAL);
        if ($resumable) {
            $thr->resume() if ($thr->is_suspended());
        }
    }
}

}

1;

__END__