"锁定"在Perl中究竟做了什么?

tjw*_*992 5 perl

我正在写一个Perl脚本,并注意到我的编辑器突出显示了"锁定"这个词.我很好奇,所以我查看了Perl中的"锁定",并且无法找到一个直截了当的答案(至少没有一个我完全理解的答案).

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


例如:锁定THING

"在THING中包含的共享变量或引用对象上放置一个建议锁定,直到锁定超出范围."


这到底是什么意思?"锁定"功能不用于锁定文件,因为我读过的所有内容都说使用"flock",所以什么是"锁定"用于?是否与线程有关并确保同时运行的多个进程不会相互碰撞?

Sob*_*que 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();
}
Run Code Online (Sandbox Code Playgroud)

您既可以将其用于资源控制,也可以创建互斥,或者您可以使用它来锁定例如哈希,如果您想要更新它而不需要另一个线程同时执行此操作.

你应该注意 - 虽然lock没有强制执行.尽管如此,你仍然可以修改共享变量lock.只有lock函数调用才会测试变量当前是否已解锁.

当你进行变量操作时,使用它很重要lock.read->change->write如果你没有锁定你可以创建竞争条件的任何测试- 你不能确定在读写之间,另一个线程不会做同样的事情.

您可能还想看看Thread::Semaphore哪些类似的东西.