我正在写一个Perl脚本并注意到我的编辑器突出显示了“锁定”这个词。我很好奇,所以我查看了Perl中的“锁定”,并且无法找到一个直截了当的答案(至少没有一个我完全理解的答案)。
这是我找到的最佳答案: http://perldoc.perl.org/functions/lock.html
ex:lock THING
“对 THING 中包含的共享变量或引用对象进行建议锁定,直到锁定超出范围。”
这究竟是什么意思? “锁定”功能不用于锁定文件,因为我读过的所有内容都说使用“flock”,所以什么是“锁定”用于?它是否与线程有关,并确保同时运行的多个进程不会相互碰撞?
答案 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;
仅在流程中提供同步性。但这也意味着它不需要使用任何命名的外部资源(例如文件)。