2014-08-29 28 views
5

Pisałem skrypt Perla i zauważyłem, że mój redaktor wyróżnił słowo "blokada". Byłem ciekawy, więc spojrzałem na to, co "blokada" robi w Perlu i nie byłem w stanie znaleźć prostej odpowiedzi (przynajmniej takiej, której nie potrafiłbym w pełni zrozumieć).Co dokładnie robi "blokowanie" w Perlu?

To najlepsza odpowiedź znalazłem: http://perldoc.perl.org/functions/lock.html


ex: zablokowanie THING

„umieszcza doradczą blokadę na zmiennej współdzielonej lub obiekt odwołanie zawarte w RZECZY aż blokada wychodzi poza zakres. "


Co to dokładnie oznacza? Funkcja "lock" nie służy do blokowania plików, ponieważ wszystko, co przeczytałem, mówi o używaniu "flock", więc do czego służy "lock"? Czy ma to związek z wątkami i upewnieniem się, że wiele procesów działających w tym samym czasie nie wpada na siebie?

+0

Zobacz [ten temat] (http://www.perlmonks.org/?node_id=579444), aby uzyskać informacje – Andrei

Odpowiedz

6

Jego głównym celem jest wielowątkowość. Blokuje wspólną zmienną, tak, że jeśli jakikolwiek inny wątek spróbuje go przetworzyć, to wywołanie lock będzie blokowane, dopóki nie zostanie zwolnione.

Aby zilustrować:

#!/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(); 
} 

Można użyć go do kontroli zasobów, aby stworzyć wzajemne wykluczanie, lub można go użyć, aby zablokować np skrót, gdy chcesz go zaktualizować bez wykonywania innego wątku w tym samym czasie.

Należy jednak zauważyć, że - lock nie jest egzekwowany. Nadal możesz modyfikować udostępnioną zmienną pomimo lock. To tylko wywołanie funkcji lock, które sprawdzi, czy zmienna jest aktualnie odblokowana.

Podczas wykonywania różnych czynności, ważne jest użycie lock. Każdy test, w którym możesz read->change->write możesz stworzyć warunki wyścigu, jeśli nie blokujesz - nie możesz być pewien, że między odczytem i zapisem inny wątek nie zrobi tego samego.

Możesz również spojrzeć na Thread::Semaphore, która robi coś podobnego.

2

Pod względem blokowania plików, z którego zdają się mieć jakąś wiedzę:

  • Kiedy robisz flock($fh, LOCK_EX) or die $!;, będzie blokować aż uzyskuje blokadę na tym pliku. Żadne dwa uchwyty nie mogą jednocześnie blokować tego pliku.

  • Po wykonaniu lock $var; zablokuje się, dopóki nie uzyska blokady dla tej zmiennej współdzielonej. Żadne dwa wątki nie mogą jednocześnie blokować tej wspólnej zmiennej.

Jak widać, obie metody zapewniają wzajemny dostęp do dowolnych zasobów.

Uwagi:

  • współdzielone zmienne występują w procesie tak lock $var; tylko zapewnia synchronizację w procesie. Ale oznacza to również, że nie musi używać żadnych nazwanych zasobów zewnętrznych (np. Pliku).
Powiązane problemy