Sbloccato, sicurezza di funzionamento hash condiviso in filettato perl
-
27-09-2019 - |
Domanda
Domanda
E 'sicuro per più thread per prelevare e semplice negozio, i valori individuali in un condiviso hash, senza lock()
ing l'hash?
Puoi dimostrarlo o citare forte autorità?
Sfondo
La mia convinzione è che nella peggiore delle ipotesi manipolazioni hash sbloccati potrebbero portare a segfaults.
Codice Tuttavia, ho poco tempo fa visto che l'attività discussioni coordinate di lavoro in tale maniera a, che l'autore ritiene di essere al sicuro. Il codice in questione esegue solo recupera semplici e negozi:
- L'hash condiviso è un semplice, hash condiviso (non un definito dall'utente, tie () d costrutto)
- I valori sono scalari semplice, non i riferimenti e non si sono condivisi
- Ogni / coppia chiave valore viene memorizzato in modo univoco e modificato da uno e un solo filo
- Tutte le coppie chiave / valore può essere recuperato da qualsiasi thread
- Non itera filo attraverso la hash condiviso (senza
each()
, senzakeys()
névalues()
looping)
Codice estratto
my %status : shared;
for my $id (1 .. $n) {
threads->create(\&thread_routine);
}
sub thread_routine {
my $me = threads->tid();
$status{ $me } = 'Getting ready';
... do something ...
$status{ $me } = 'Thinking';
... do something else ...
$status{ $me } = 'Looking around';
for my $tid (threads->list) {
next if $tid == $me;
if ($status{ $tid } eq "Thinking") { ... react ... }
...
}
$status{ $me } = 'All done';
}
Soluzione
Ecco una risposta autorità. Dal perlthtut , alla fine del "condivise e non dati",
Si noti che condiviso garanzie variabile che, se due o più thread tentano di modificarlo allo stesso tempo, la stato interno della volontà variabile non danneggiato. Tuttavia, ci sono garanzie al di là di questo, come spiegato nella sezione successiva.
Quindi, Sì, è sicuro per memorizzare e recuperare semplici valori individuali di un hash senza blocco.
Altri suggerimenti
E 'la mia comprensione che tutto ciò che di blocco è necessario per prevenire la corruzione alla struttura interna del hash è gestito automaticamente. La funzione è quella di permettere lock
fili di coordinare in modo che la costanza di livello superiore del hash può essere mantenuta. Poiché in questo caso ogni chiave viene modificata da un solo filo, nessun blocco esplicito è necessario.
Non è possibile citare un'autorità, solo che non riesco a trovare nulla nel le discussioni :: condiviso documentazione che suggerisce è necessario essere attenti a bloccare una variabile prima di modificarlo. Se facendo che potrebbe causare Perl per incidente, si potrebbe pensare che sarebbe merita una menzione.
IMHO funzionerà OK.
discussioni modulo docs a citare di non usare le discussioni nei blocchi END, e non parlare di mutex a tutti in qualsiasi altro luogo oltre a quello. Se mutex erano necessarie che avrebbero di sicuro essere inclusi nelle discussioni modulo? - ma non sono, sono essi
my %hash : shared;
map {
async { map { $hash{$_}++; } (1 .. 30); }
} (1 .. 300);
map {$_->join} (threads->list);
print Dumper \%hash;
Ogni volta che corro che un valore get 300 in ciascun tasto. Finora non ho potuto trovare un modo migliore per dimostrare che sia sicuro.