Thread::Semaphore - 线程安全信号量
本文档介绍 Thread::Semaphore 版本 2.13
use Thread::Semaphore;
my $s = Thread::Semaphore->new();
$s->down(); # Also known as the semaphore P operation.
# The guarded section is here
$s->up(); # Also known as the semaphore V operation.
# Decrement the semaphore only if it would immediately succeed.
if ($s->down_nb()) {
# The guarded section is here
$s->up();
}
# Forcefully decrement the semaphore even if its count goes below 0.
$s->down_force();
# The default value for semaphore operations is 1
my $s = Thread::Semaphore->new($initial_value);
$s->down($down_value);
$s->up($up_value);
if ($s->down_nb($down_value)) {
...
$s->up($up_value);
}
$s->down_force($down_value);
信号量提供了一种机制来调节对资源的访问。与锁不同,信号量不绑定到特定的标量,因此可用于控制对任何您希望使用它们的资源的访问。
信号量不会将它们的值限制为零和一,因此它们可用于控制对可能有多个资源(例如文件句柄)的访问。增量和减量值也不固定为一,因此线程可以一次保留或返回多个资源。
new
创建一个新的信号量,并将其计数初始化为指定数字(必须为整数)。如果未指定数字,则信号量的计数默认为 1。
down
方法将信号量的计数减少指定数字(必须为整数 >= 1),如果未指定数字,则减少 1。
如果信号量的计数将降至零以下,则此方法将阻塞,直到信号量的计数大于或等于您要将信号量的计数减少的量。
这是信号量的“P 操作”(名称源自荷兰语单词“pak”,意思是“捕获”——信号量操作是由已故的荷兰人迪杰斯特拉命名的)。
down_nb
方法尝试将信号量的计数减少指定数字(必须为整数 >= 1),如果未指定数字,则减少 1。
如果信号量的计数将降至零以下,则此方法将返回 false,并且信号量的计数保持不变。否则,信号量的计数将递减,并且此方法返回 true。
down_force
方法将信号量的计数减少指定数字(必须为整数 >= 1),如果未指定数字,则减少 1。此方法不会阻塞,并且可能导致信号量的计数降至零以下。
down_timed
方法尝试在给定的以秒为单位的指定超时时间内将信号量的计数减少 1 或指定数字(必须为整数 >= 0)。
如果信号量的计数将降至零以下,则此方法将阻塞,直到信号量的计数大于或等于您要将信号量的计数减少的量,或者直到达到超时时间。
如果达到超时时间,则此方法将返回 false,并且信号量的计数保持不变。否则,信号量的计数将递减,并且此方法返回 true。
up
方法将信号量的计数增加指定数量(必须是整数 >= 1),如果没有指定数量,则增加 1。
如果 up
将信号量的计数增加到大于 down
试图减少的量,这将解除任何试图 down
信号量而被阻塞的线程。例如,如果有三个线程试图 down
一个信号量,而另一个线程 up
了信号量,则两个阻塞的线程(哪两个是不确定的)将被解除阻塞。
这是信号量的“V 操作”(名称源自荷兰语“vrij”,意为“释放”)。
由 Thread::Semaphore 创建的信号量可以在有线程和无线程的应用程序中使用。这允许你编写可能使用信号量的模块和包,并且可以在任一环境中运行。
MetaCPAN 上的 Thread::Semaphore:https://metacpan.org/release/Thread-Semaphore
CPAN 分发的代码存储库:https://github.com/Dual-Life/Thread-Semaphore
CPAN 上此分发中 examples 目录中的示例代码。
Jerry D. Hedden,<jdhedden AT cpan DOT org>
此程序是免费软件;你可以根据与 Perl 自身相同的条款重新分发或修改它。