Dalla discussione che ho visto sembra che il funzionamento atomico e la sicurezza dei thread siano la stessa cosa, ma molte persone dicono che sono diverse. Qualcuno può dirmi la differenza se ce n'è uno?
Dalla discussione che ho visto sembra che il funzionamento atomico e la sicurezza dei thread siano la stessa cosa, ma molte persone dicono che sono diverse. Qualcuno può dirmi la differenza se ce n'è uno?
Risposte:
Le operazioni atomiche sono un modo per raggiungere la sicurezza dei thread utilizzando alcuni tipi di blocchi come mutex o semafori che utilizzano operazioni atomiche internamente o implementando la sincronizzazione senza blocchi utilizzando atomismi e recinti di memoria.
Pertanto, le operazioni atomiche su tipi di dati primitivi sono uno strumento per raggiungere la sicurezza dei thread, ma non garantiscono automaticamente la sicurezza dei thread poiché in genere sono presenti più operazioni che si basano l'una sull'altra. È necessario assicurarsi che queste operazioni vengano eseguite senza interruzione, ad esempio utilizzando i mutex.
Sì, scrivere uno di questi tipi di dati atomici in c # è thread-safe, ma ciò non rende la funzione che li usi in thread safe. Assicura solo che la singola scrittura sia eseguita correttamente anche se un secondo thread vi accede "contemporaneamente". Tuttavia, la lettura successiva dal thread corrente non è garantita per ottenere il valore precedentemente scritto come potrebbe aver scritto un thread diverso su di esso, solo che il valore letto è valido.
Atomicità e sicurezza dei thread sono due cose diverse. L'atomicità si riferisce alla qualità "tutto o niente" di un'operazione; se un'operazione non può essere eseguita con successo al 100%, il sistema dovrebbe rimanere nello stato generale in cui era stato prima dell'inizio di qualsiasi parte dell'operazione. L'esempio classico è una transazione di database; Quando si salva una fattura, compresa l'intestazione e più elementi pubblicitari, ogni singola parte di ogni singola riga del database deve essere posizionata correttamente; in caso contrario, i dati vengono persi o danneggiati. Se un elemento pubblicitario non può essere inserito, non solo dovrebbero essere inserite altre righe rimanenti, ma nessuna delle righe già elaborate dovrebbe rimanere.
La sicurezza del thread si riferisce a una combinazione di cose, inclusa l'atomicità, che consente a un'operazione di "rientrare"; più lavoratori possono eseguire la stessa operazione, iniziando nello stesso momento o in momenti diversi, senza alcun effetto sugli altri. Esistono molti modelli per un funzionamento senza fili; la maggior parte si riduce concettualmente all'esecuzione di più attività parallele in completo isolamento (due lavoratori possono eseguire la stessa attività su due diversi oggetti o raccolte di oggetti senza mai sapere che l'altro lavoratore esiste) o impostare una "pipeline" all'interno della quale più lavoratori eseguono ciascuno un'attività da un'intera operazione (o ogni lavoratore passa dalla prima attività alla successiva e così via, oppure si concentra su un'attività e consegna il suo "prodotto di lavoro" intermedio al lavoratore successivo).
Un'operazione atomica è un'operazione che non può essere interrotta.
Un thread sicuro è un thread che può essere interrotto in modo sicuro.
La sicurezza del thread è ottenuta con operazioni atomiche, in particolare nella logica che impedisce l'accesso a risorse critiche più volte.
L'operazione atomica di base è Test-and-set , che viene utilizzata per implementare i semafori, che a loro volta vengono utilizzati per implementare la sicurezza del thread.
La sicurezza dei thread è più un framework o un "concetto", l'operazione atomica è un sottoinsieme, uno dei mezzi (uno dei tanti) per ottenere lo status di "thread-safe".
La sicurezza del thread si riferisce a un processo a cui è possibile accedere da thread separati, in cui l'accesso a uno (e manipolazione dei dati), non corromperà l'integrità del funzionamento dell'altro.
Gran parte dell'abilità del programmatore è sapere come raggiungerlo, a seconda della situazione e dell'obiettivo chiave, potrebbe essere necessario implementare, ad esempio: blocchi, semafori, chiavistelli, oggetti atomici, regole di sincronizzazione ecc ...