【问题标题】:What exactly does "lock" do in Perl?Perl 中的“锁”到底是做什么的?
【发布时间】:2014-09-01 07:41:37
【问题描述】:

我正在编写一个 Perl 脚本,并注意到我的编辑器突出显示了“锁定”这个词。我很好奇,所以我查看了 Perl 中的“lock”是做什么的,但一直找不到一个简单的答案(至少不是我能完全理解的答案)。

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


例如:锁定事物

“在 THING 中包含的共享变量或引用对象上放置建议锁,直到锁超出范围。”


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

【问题讨论】:

标签: perl


【解决方案1】:

它的主要目的是用于多线程。它锁定一个共享变量,这样如果任何其他线程尝试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,它做了类似的事情。

【讨论】:

    【解决方案2】:

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

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

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

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

    注意事项:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2015-08-06
      • 2013-09-02
      • 2014-01-02
      • 2013-10-10
      • 2017-05-08
      • 2022-01-20
      相关资源
      最近更新 更多