“锁定”在Perl中究竟做了什么?

时间:2014-08-29 16:25:21

标签: perl

我正在写一个Perl脚本并注意到我的编辑器突出显示了“锁定”这个词。我很好奇,所以我查看了Perl中的“锁定”,并且无法找到一个直截了当的答案(至少没有一个我完全理解的答案)。

这是我找到的最佳答案: http://perldoc.perl.org/functions/lock.html


ex:lock THING

“对 THING 中包含的共享变量或引用对象进行建议锁定,直到锁定超出范围。”


这究竟是什么意思? “锁定”功能不用于锁定文件,因为我读过的所有内容都说使用“flock”,所以什么是“锁定”用于?它是否与线程有关,并确保同时运行的多个进程不会相互碰撞?

2 个答案:

答案 0 :(得分:6)

它的主要目的是进行多线程处理。它锁定一个共享变量,这样如果任何其他线程尝试lock它,那么lock调用将阻塞直到它被释放。

举例说明:

#!/usr/bin/perl
use strict;
use warnings;

use threads;
use threads::shared;

my $lock_var : shared;

sub worker_thread {
    print threads -> self -> tid(). ": Waiting for lock\n";
    lock ( $lock_var );
    print threads -> self -> tid(). ": got lock, doing some pretend code\n";
    sleep rand(10);
    #lock released when out of scope.
}

for ( 1..10 ) {
    threads -> create ( \&worker_thread );
}

foreach my $thr ( threads -> list ) {
    $thr -> join();
}

您可以将其用于资源控制,创建互斥,也可以使用它来锁定,例如当你想要更新它时没有另一个线程同时执行此操作的哈希。

您应该注意 - lock未强制执行。尽管lock,您仍然可以修改共享变量。只有lock函数调用才会测试变量当前是否已解锁。

当你进行变量操作时,使用lock很重要。如果你没有锁定,你read->change->write可以创建竞争条件的任何测试 - 你不能确定在读写之间,另一个线程不会做同样的事情。

您可能还想看看Thread::Semaphore做类似的事情。

答案 1 :(得分:3)

在文件锁定方面,您似乎对此有一些了解:

  • 执行flock($fh, LOCK_EX) or die $!;时,它会一直阻止,直到获得该文件的锁定为止。没有两个句柄可以同时锁定该文件。

  • 执行lock $var;时,它会一直阻塞,直到获得该共享变量的锁定为止。没有两个线程可以同时锁定该共享变量。

如您所见,两者都提供了一种提供对某些任意资源的相互访问的方法。

注意:

  • 共享变量存在于流程中,因此lock $var;仅在流程中提供同步性。但这也意味着它不需要使用任何命名的外部资源(例如文件)。