Differenza tra funzionamento atomico e sicurezza del filo?


10

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?


4
Le operazioni atomiche aiuteranno a garantire la sicurezza del thread, ma come potrebbero essere la stessa cosa ? Una "discussione" non è la stessa di una "operazione".
user50849

Risposte:


11

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.


Int, bool, float sono thread-safe o atomici?
user960567

1
@ user960567 - i tipi di dati sono proprio questo: tipi di dati. Spetta al compilatore decidere come accedervi. Pensa a un int64 su una CPU 8086.
mouviciel,

2
In C #, in particolare, il fatto che la domanda sia taggata, legge e scrive deve essere atomico sui tipi di dati di base. Vedi Ecma 334
user50849

2
E 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.
Archy,

4
x = 5 è atomico in c #. Ma subito dopo questa operazione potrebbe essere sovrascritto. x = x + 1 viene eseguito 1. caricando x nel registro 2. incrementa x nel registro 3. memorizza x in memoria. Se un secondo thread fa la stessa cosa allo stesso tempo, entrambi caricheranno lo stesso valore, lo incrementeranno e lo memorizzeranno facendo sì che x venga incrementato solo una volta anziché due volte. InterlockedIncrement utilizza un'istruzione del processore speciale per eseguire un incremento atomico o garantisce ciò utilizzando un meccanismo di blocco, ad esempio CAS, per garantire che mentre il nuovo valore non è scritto, nessun altro thread può leggere il vecchio valore.
Archy,

3

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).


2

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.


Non è possibile interrompere un'operazione in più passaggi ed essere ancora chiamata atomica se è garantito il rollback delle modifiche?
user50849

1
No. Atomic deve essere compreso nel suo significato etimologico: ἄτομος, atomos, indivisibile.
mouviciel,

Int, bool, float sono thread-safe o atomici?
user960567

Ma non c'è differenza tra essere indivisibili e apparire indivisibili per un osservatore ? Secondo la tua definizione, nessuna operazione atomica potrebbe contenere più di un singolo passaggio. Credo che la parola "appare" nella definizione di operazione atomica di Wikipedia sia importante. (Sono in chat se qualcuno vuole portarlo lì) :)
user50849

C'è una grande differenza: un thread sicuro può essere interrotto e non c'è garanzia di quanto tempo. Questo è fondamentale nel calcolo in tempo reale. Un'operazione atomica (con blocchi di interrupt se è multi-step) è garantita per terminare dopo un periodo di tempo prevedibile.
mouviciel,

1

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 ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.