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(), senza keys()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';
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top