2014-08-29 54 views
5

我正在写一个Perl脚本,并注意到我的编辑器突出显示了单词“锁定”。我很好奇,所以我查了一下Perl中的“锁定”,并且一直无法找到一个直截了当的答案(至少不是我可以完全理解的答案)。Perl中“锁定”的含义是什么?

这是最好的答案,我发现: http://perldoc.perl.org/functions/lock.html


例如:锁定THING

“则以包含在THING直到上的共享变量的咨询锁或引用的对象锁定超出范围。“


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

+0

请参阅[此主题](http://www.perlmonks.org/?node_id=579444)了解一些信息 – Andrei 2014-08-29 16:29:42

回答

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很重要。任何测试,如果你不锁定你可以创建竞争条件 - 你不能确定在读写之间,另一个线程不会做同样的事情。

你可能也想看看Thread::Semaphore它做了类似的事情。

2

在其中,你似乎有一定的了解文件锁定方面:

  • 当你做flock($fh, LOCK_EX) or die $!;,它会阻塞,直到它获得在该文件上的锁。没有两个句柄可以同时对该文件进行锁定。

  • 当你做lock $var;时,它会阻塞,直到它获得该共享变量的锁定。没有两个线程可以同时对该共享变量进行锁定。

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

注:

  • 共享变量的过程中存在,所以只lock $var;一个进程中提供同步。但这也意味着它不需要使用任何命名的外部资源(例如文件)。