“究竟是什么?”;锁;你喜欢Perl吗?
我正在编写一个Perl脚本,注意到我的编辑器突出显示了“lock”一词。我很好奇,所以我查找了“lock”在Perl中的作用,但未能找到一个简单明了的答案(至少我不能完全理解) 这是我找到的最好的答案:“究竟是什么?”;锁;你喜欢Perl吗?,perl,Perl,我正在编写一个Perl脚本,注意到我的编辑器突出显示了“lock”一词。我很好奇,所以我查找了“lock”在Perl中的作用,但未能找到一个简单明了的答案(至少我不能完全理解) 这是我找到的最好的答案: 锁的东西 “在包含在THING中的共享变量或引用对象上放置建议锁,直到该锁超出范围。” 这到底意味着什么?“lock”函数不是用来锁定文件的,因为我读到的所有东西都说使用“flock”来锁定文件,那么“lock”用于什么呢?它是否与线程和确保同时运行的多个进程不会相互碰撞有关?它的主要用途
锁的东西 “在包含在THING中的共享变量或引用对象上放置建议锁,直到该锁超出范围。”
这到底意味着什么?“lock”函数不是用来锁定文件的,因为我读到的所有东西都说使用“flock”来锁定文件,那么“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
非常重要。在任何测试中,如果你不锁定,你可以创建一个竞争条件,你不能确定在读和写之间,另一个线程不会这样做
您可能还想看看执行类似操作的Thread::Semaphore
在文件锁定方面,您似乎有些了解:
- 当你做
flock($fh,LOCK_EX)或die$代码>,它将一直阻止,直到获得该文件的锁为止。没有两个句柄可以同时持有该文件的锁
- 当您执行
锁定$var代码>,它将阻塞,直到获得该共享变量的锁为止。没有两个线程可以同时持有该共享变量的锁
如您所见,两者都提供了一种相互访问某些任意资源的方法
注:
- 共享变量存在于流程中,因此
lock$var代码>仅在进程内提供同步性。但这也意味着它不需要使用任何命名的外部资源(例如文件)李>
有关详细信息,请参阅