2014-10-06 5 views
6

나는 threads::shared 설명을 읽고이 공유 : 기본적으로펄이 변수 자성 및 가시성

, 변수는 각 스레드에 개인이며, 각각의 새로 생성 된 쓰레드는 기존의 각 변수의 개인 복사본을 가져옵니다.

my $var :shared; 
$var = 10; 

이 변수 내가 만든 모든 스레드에 대해 한 번만 존재 의미 :이 모듈은 (more)

의 내가 이런 공유 변수가 있다고 가정 해 봅시다 ... 당신이 다른 스레드를 통해 변수를 공유 할 수 있습니다 . 자성 및 가시성에 대한 지금


: thread_A가 할당하는 경우

새로운 값의 11 가정 해 봅시다 :

$var = 11; 

가 보장 그게 thread_B (내가 만든 수있는 모든 다른 스레드) 값 11이 표시됩니까? 할당은 원자 단위로 수행됩니까?

또는 Java에서 먼저 잠금을 획득 한 다음 할당을 수행하고 잠금을 해제하는 것과 같습니다. 그리고 동일한 잠금을 사용하는 스레드 만 업데이트 된 값을 볼 수 있습니까?

또는 자바의 휘발성 원시 변수처럼 동작합니까?

답변

4

업데이트에 원 자성을 적용하는 것이 좋습니다. Perl은이 작업을 수행 할 수 있도록 lock을 제공합니다. lock 변수 자체 - 변수가 스레드와 공유되는 경우 잠금 상태도 마찬가지입니다.

$var을 업데이트하면 다른 스레드에 새 값이 표시됩니다.

하지만 액세스 할 때 상황에 따라 잠재적 인 경쟁 조건이 있습니다. 그게 문제라면 - lock 그리고 그렇지 않다면 ... 계속하십시오.

$var++과 같은 연산은 원자적일 수 있다는 점에 유의하십시오. (http://perldoc.perl.org/perlthrtut.html#Thread-Pitfalls%3a-Races)