2014-08-29 93 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;一個進程中提供同步。但這也意味着它不需要使用任何命名的外部資源(例如文件)。