“究竟是什么?”;锁;你喜欢Perl吗?

“究竟是什么?”;锁;你喜欢Perl吗?,perl,Perl,我正在编写一个Perl脚本,注意到我的编辑器突出显示了“lock”一词。我很好奇,所以我查找了“lock”在Perl中的作用,但未能找到一个简单明了的答案(至少我不能完全理解) 这是我找到的最好的答案: 锁的东西 “在包含在THING中的共享变量或引用对象上放置建议锁,直到该锁超出范围。” 这到底意味着什么?“lock”函数不是用来锁定文件的,因为我读到的所有东西都说使用“flock”来锁定文件,那么“lock”用于什么呢?它是否与线程和确保同时运行的多个进程不会相互碰撞有关?它的主要用途

我正在编写一个Perl脚本,注意到我的编辑器突出显示了“lock”一词。我很好奇,所以我查找了“lock”在Perl中的作用,但未能找到一个简单明了的答案(至少我不能完全理解)

这是我找到的最好的答案:


锁的东西

“在包含在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仅在进程内提供同步性。但这也意味着它不需要使用任何命名的外部资源(例如文件)
    
有关详细信息,请参阅