2010-01-03 9 views

risposta

14

Vorresti utilizzare le goroutine e sincronizzare l'accesso alle tue mappe tramite channels. Spiegazione da the FAQ:

Dopo lunga discussione è stato deciso che l'utilizzo tipico di mappe ha non richiedere l'accesso sicuro da più thread, e in quei casi in cui lo ha fatto, la mappa era probabilmente parte di alcuni dati più grande struttura o calcolo già sincronizzato. Pertanto, richiedendo che tutte le operazioni sulla mappa assumano un mutex, tutte le operazioni sulla mappa effettuano il rallentamento della maggior parte dei programmi e aggiungano la sicurezza dello a pochi. Questa non è stata una decisione facile, tuttavia, dal momento che significa l'accesso alla mappa incontrollato può mandare in crash il programma.

La lingua non preclude gli aggiornamenti delle mappe atomiche. Quando richiesto, come come quando si ospita un programma non attendibile, l'implementazione potrebbe accedere alla mappa.

+0

È consigliabile ma devono comunque documentare e mantenere quali funzioni sono sicure. Spesso mi imbatto in codice dove in pass1 riempio una mappa con valori e in pass2 la leggo contemporaneamente da molti thread diversi senza una singola sincronizzazione. – Lothar

+0

Lo stile Go sembra fortemente ponderato per non utilizzare mai lo stato mutabile condiviso. Se stai leggendo semplicemente la mappa da fili diversi, dovresti stare bene. (Anche se questo non è assolutamente ovvio: esistono plausibili implementazioni di mappe che sono fisicamente mutate su letture logiche ...) – poolie

Problemi correlati