2014-10-06 17 views
6

Questo ho letto dalla descrizione threads::shared:Perl condiviso variabili atomicità e visibilità

Per impostazione predefinita, le variabili sono private di ogni thread, e ogni thread appena creato ottiene una copia privata di ogni variabile esistente. Questo modulo permette di condividere le variabili tra le varie discussioni ... (more)

Diciamo che ho una variabile condivisa in questo modo:

my $var :shared; 
$var = 10; 

Questo significa che la variabile esiste solo una volta per tutti i fili che creo .


Ora circa atomicità e la visibilità:

Se thread_A assegna un nuovo valore diciamo 11:

$var = 11; 

E 'garantito che thread_B (e tutti gli altri thread che potrebbe aver creato) vedrà il valore 11? E l'incarico è eseguito atomicamente?

Oppure abbiamo in Java come prima cosa acquisire un blocco e quindi eseguire l'assegnazione e rilasciare il blocco. E solo i thread che utilizzano lo stesso lock sono garantiti per vedere il valore aggiornato?

Oppure questo si comporta come variabili primitive volatili in Java?

risposta

4

È sempre buona norma applicare l'atomicità negli aggiornamenti. Perl fornisce lock per consentirci di farlo. Puoi lock la variabile stessa - se la variabile è condivisa con il thread, allora lo è anche lo stato di blocco.

Se si aggiorna $var, gli altri thread vedranno il nuovo valore.

Ma si ha una potenziale condizione di gara, a seconda di quando accedono. Se questo è un problema - lock e se non lo è ... continua.

Tenere presente che operazioni come $var++ non sono garantite per essere atomiche. (http://perldoc.perl.org/perlthrtut.html#Thread-Pitfalls%3a-Races)