2014-08-29 5 views
5

Я писал сценарий Perl и заметил, что мой редактор выделил слово «lock». Мне было любопытно, поэтому я посмотрел, что делает «замок» на Perl и не смог найти прямой ответ (по крайней мере, не тот, который я мог бы полностью понять).Что именно делает «блокировка» в Perl?

Это лучший ответ, который я нашел: http://perldoc.perl.org/functions/lock.html


например: блокировка ВЕЩИ

«ставит консультативную блокировку разделяемого переменной или объект ссылки не содержащуюся в ВЕЩИ до блокировка выходит за рамки ».


Что именно это означает? Функция блокировки не используется для блокировки файлов, потому что все, что я прочитал, говорит, что для этого используется «стая», поэтому для чего используется «блокировка»? Нужно ли это делать с потоками и убедиться, что несколько процессов, запущенных одновременно, не сталкиваются друг с другом?

+0

См. [Эту тему] (http://www.perlmonks.org/?node_id=579444) для получения дополнительной информации – Andrei

ответ

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. Если у вас есть read->change->write, вы можете создать условие гонки, если вы не заблокируете - вы не можете быть уверены, что между чтением и записью другой поток не будет делать то же самое.

Возможно, вы также захотите посмотреть на Thread::Semaphore, который делает что-то подобное.

2

С точки зрения блокировки файла, из которого, как представляется, имеют некоторые знания:

  • Когда вы flock($fh, LOCK_EX) or die $!;, он будет блокироваться, пока он не получит блокировку на этот файл. Две ручки не могут удерживать блокировку в этом файле одновременно.

  • Когда вы сделаете lock $var;, он будет заблокирован, пока не получит блокировку этой общей переменной. Ни один из двух потоков не может одновременно блокировать эту общую переменную.

Как вы можете видеть, оба являются средством обеспечения взаимного доступа к некоторым произвольным ресурсам.

Примечания:

  • Общие переменные существуют внутри процесса, поэтому lock $var; только обеспечивает синхронность в пределах процесса. Но это также означает, что не нужно использовать какие-либо именованные внешние ресурсы (например, файл).
Смежные вопросы