2010-04-22 12 views
7

In base a an article su IBM.com, "una condizione di competizione è una situazione in cui due o più thread o processi stanno leggendo o scrivendo alcuni dati condivisi, e il risultato finale dipende dalla tempistica di come sono programmati i thread. può portare a risultati imprevedibili e bug di programma sottili. " . Sebbene l'articolo riguardi Java, in generale mi è stata insegnata la stessa definizione.Che dire delle condizioni di gara nella lettura multithread?

Per quanto ne so, la semplice operazione di lettura dalla RAM è composta dall'impostazione degli stati di specifiche linee di ingresso (indirizzo, lettura ecc.) E dalla lettura degli stati delle linee di uscita. Questa è un'operazione che ovviamente non può essere eseguita simultaneamente da due dispositivi e deve essere serializzata.

Ora supponiamo di avere una situazione in cui un paio di thread accedono a un oggetto in memoria. In teoria, questo accesso dovrebbe essere serializzato per prevenire condizioni di gara. Ma ad es. l'algoritmo di lettori/scrittori presuppone che un numero arbitrario di lettori possa utilizzare la memoria condivisa allo stesso tempo.

Quindi, la domanda è: è necessario implementare un blocco esclusivo per la lettura quando si utilizza il multithreading (in WinAPI, ad esempio)? Se no, perché? Dove viene implementato questo controllo: sistema operativo, hardware?

Con i migliori saluti, Kuba

+0

hah, said'ya;] –

risposta

6

lettura memoria a livello hardware è fatto in sequenza - non c'è bisogno di preoccuparsi di concorrenza a questo livello. Due thread emettono le istruzioni di lettura e tutte le cose necessarie - gli indirizzi di impostazione sul bus degli indirizzi e le letture effettive vengono implementate dall'hardware di accesso alla memoria in modo tale che le letture funzionino sempre correttamente.

In effetti lo stesso vale per gli scenari di lettura/scrittura eccetto che quando le richieste di lettura e scrittura sono intercalate otterrete risultati diversi in base alla tempistica ed è per questo che è necessaria la sincronizzazione.

0

Non c'è una risposta semplice a questa domanda. API diverse (e ambienti diversi) avranno livelli diversi di consapevolezza multithreaded e sicurezza multithread.

2

Finché non c'è nulla che cambi i dati, è perfettamente sicuro leggerlo da diversi thread. Anche se due CPU (o core) corrono per accedere alla memoria per la lettura allo stesso esatto ciclo di clock, i loro accessi saranno serializzati dal controller di memoria e non interferiranno l'uno con l'altro. Questa funzione è essenziale per il corretto funzionamento di HW.

Problemi correlati