| Thread-CriticalSection documentation | Contained in the Thread-CriticalSection distribution. |
Thread::CriticalSection - Run a coderef inside a critical section
Version 0.02
use threads;
use Thread::CriticalSection;
my $cs = Thread::CriticalSection->new;
$cs->execute(sub {
# your code is protected by $cs
});
# you can also return stuff
my $result = $cs->execute(sub {
# do work in a cosy critical section
return $result;
});
# and you can even use wantarray
my @victims = $cs->execute(sub {
# do work in a cosy critical section
return wantarray? @result : \@result;
});
As of 2008/06/18, this module is considered beta quality. The interface should not suffer any changes but its a young module with very little use.
You'll still see "Scalars leaked" in the test suite, and I would like to get rid of them before declaring the code as stable.
The abnormal thread terminations I get when running the test suite are in the unsafe tests, so I think I'm getting into perl threads issues, not bugs in this module. Prof of the opposite (in the form of failing tests) are most welcome.
The Thread::CriticalSection module allows you to run a coderef inside a critical section.
All the details of entering and leaving the critical section are taken care
of by the execute() method.
You can have several critical sections simultaneously inside your program.
The usual care and feeding regarding deadlocks should be taken when calling
execute() recursively.
Creates and returns a new critical section. Requires no parameters.
Executes the given $coderef inside the critical section. The $coderef can use wantarray to inspect the context of the call and react accordingly.
Pedro Melo, <melo at cpan.org>
You can find the source for this module at http://github.com/melo/thread--criticalsection/.
Please report any bugs or feature requests to bug-thread-criticalsection at rt.cpan.org, or through
the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Thread-CriticalSection. I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.
You can find documentation for this module with the perldoc command.
perldoc Thread::CriticalSection
You can also look for information at:
http://rt.cpan.org/NoAuth/Bugs.html?Dist=Thread-CriticalSection
Copyright 2008 Pedro Melo, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| Thread-CriticalSection documentation | Contained in the Thread-CriticalSection distribution. |
package Thread::CriticalSection; use warnings; use strict; use Thread::Semaphore; our $VERSION = '0.02'; sub new { my $class = shift; return bless { sem => Thread::Semaphore->new, }, $class; } sub execute { my ($self, $sub) = @_; my $sem = $self->{sem}; my $wantarray = wantarray; my @result; $sem->down; eval { if ($wantarray) { @result = $sub->() } else { $result[0] = $sub->() } }; my $e = $@; $sem->up; die $e if $e; return @result if $wantarray; return $result[0]; } 42; # End of Thread::CriticalSection