2014-10-06 15 views
6

To czytam z opisu threads::shared:Perl wspólne zmienne niepodzielność i widoczność

Domyślnie, zmienne są prywatne do każdego wątku, a każdy nowo utworzony wątek dostaje prywatną kopię każdej istniejącej zmiennej. Moduł ten pozwala na udostępnianie zmienne w różnych wątków ... (more)

Powiedzmy mam wspólna zmienna tak:

my $var :shared; 
$var = 10; 

Oznacza to zmienna istnieje tylko jeden raz dla wszystkich wątków tworzę .


Teraz o atomowości i widoczności:

Jeśli thread_A przypisuje nową wartość powiedzmy 11:

$var = 11; 

To jest zagwarantowane, że thread_B (i wszystkie inne wątki mógłbym utworzone) zobaczy wartość 11? A czy przypisanie wykonywane jest atomowo?

Czy najpierw mamy coś takiego w Javie, aby uzyskać blokadę, a następnie wykonać zadanie i zwolnić blokadę. I tylko wątki używające tej samej blokady są gwarantowane, aby zobaczyć zaktualizowaną wartość?

Czy to zachowuje się jak zmienne prymitywne zmienne w Javie?

Odpowiedz

4

Dobrą praktyką jest wymuszanie atomowości w aktualizacjach. Perl zapewnia lock, abyśmy mogli to zrobić. Możesz lock sama zmienna - jeśli zmienna jest współdzielona z wątkiem, to tak samo jest stan blokady.

Po aktualizacji $var, pozostałe wątki zobaczą nową wartość.

Ale masz potencjalny stan wyścigowy, w zależności od tego, kiedy do niego dostęp. Jeśli to jest problem - lock, a jeśli nie jest ... kontynuuj.

Należy pamiętać, że operacje takie jak $var++ nie mają gwarancji, że są atomowe. (http://perldoc.perl.org/perlthrtut.html#Thread-Pitfalls%3a-Races)

Powiązane problemy