Differenza tra funzionamento atomico e sicurezza del filo?

9

Dalla discussione che ho visto sembra che operazione atomica e sicurezza dei thread siano la stessa cosa, ma molte persone dicono che sono diverse. Qualcuno può dirmi la differenza se ce n'è uno?

    
posta user960567 10.12.2012 - 11:01
fonte

4 risposte

12

Le operazioni atomiche sono un modo per ottenere la sicurezza dei thread usando un tipo di blocco come Mutex o Semaphores che utilizzano internamente operazioni atomiche o implementando lock free sincronizzazione usando atomics e memory fences.

Le operazioni atomiche sui tipi di dati primitivi sono uno strumento per ottenere la sicurezza dei thread ma non garantiscono la sicurezza dei thread automaticamente perché di solito si hanno più operazioni che fanno affidamento l'una sull'altra. Devi assicurarti che queste operazioni vengano eseguite senza interruzioni, ad esempio utilizzando Mutex.

Sì, scrivere uno di questi tipi di dati atomici in c # è sicuro da thread, 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 lo accede "allo stesso tempo". Tuttavia, la prossima lettura dal thread corrente non è garantita per ottenere il valore scritto in precedenza, poiché un thread diverso potrebbe averlo scritto, solo che il valore letto è valido.

    
risposta data 10.12.2012 - 11:22
fonte
1

Un'operazione atomica è un'operazione che non può essere interrotta.

Un thread sicuro è un thread che può essere tranquillamente interrotto.

La sicurezza del thread si ottiene con operazioni atomiche, in particolare nella logica che impedisce l'accesso alle 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.

    
risposta data 10.12.2012 - 11:13
fonte
1

Atomicità e sicurezza del 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 complessivo in cui si trovava prima dell'inizio di qualsiasi parte dell'operazione. L'esempio classico è una transazione di database; Quando si salva una fattura, inclusa la sua 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 non dovrebbero essere inserite altre righe, ma nessuna delle righe già elaborate dovrebbe rimanere.

Sicurezza del filo si riferisce a una combinazione di elementi, tra cui l'atomicità, che consente a un'operazione di essere "rientrante"; più operatori possono eseguire la stessa operazione, iniziando allo stesso momento o in momenti diversi, senza effetto su nessun altro. Esistono molti modelli per il funzionamento sicuro del filo; la maggior parte di essi si riduce concettualmente a eseguire più attività parallele in completo isolamento (due operatori possono eseguire lo stesso compito su due oggetti diversi o raccolte di oggetti senza nemmeno sapere che l'altro lavoratore esiste) o impostare una "pipeline" all'interno della quale più lavoratori eseguono ciascuna un'attività da un'intera operazione (ogni lavoratore procede dal primo al successivo e così via, oppure si concentra su un'attività e distribuisce il suo "prodotto di lavoro" intermedio al lavoratore successivo).

    
risposta data 10.12.2012 - 18:11
fonte
0

La sicurezza del thread è più una struttura o un "concetto", l'operazione atomica è un sottoinsieme, un mezzo (uno dei tanti) per raggiungere lo stato come classificato "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 la manipolazione dei dati), non compromette l'integrità dell'operazione dell'altro.

Gran parte dell'abilità del programmatore è sapere come ottenerlo, a seconda della situazione e dell'obiettivo chiave, potrebbe essere necessario implementare, ad esempio: blocchi, semafori, latch, oggetti atomici, regole di sincronizzazione ecc ...

    
risposta data 10.12.2012 - 17:21
fonte

Leggi altre domande sui tag