Se ho un singolo int che voglio scrivere da un thread e leggere da un altro, ho bisogno di usare std::atomic
, per assicurare che il suo valore sia coerente tra i core, indipendentemente dal fatto che le istruzioni leggere o no scrivere ad esso sono concettualmente atomici. Se non lo faccio, potrebbe essere che il nucleo di lettura abbia un vecchio valore nella sua cache e non vedrà il nuovo valore. Questo ha senso per me.In che modo un mutex garantisce che il valore di una variabile sia coerente tra i core?
Se si dispone di un tipo di dati complesso che non può essere letto/scritto in modo atomico, è necessario proteggerne l'accesso utilizzando alcune primitive di sincronizzazione, ad esempio std::mutex
. Ciò impedirà all'oggetto di entrare (o di essere letto da) uno stato incoerente. Questo ha senso per me.
Ciò che non ha senso per me è il modo in cui i mutex aiutano il problema di caching che l'atomica risolve. Sembrano esistere esclusivamente per impedire l'accesso concorrente ad alcune risorse, ma non per propagare alcun valore contenuto all'interno di quella risorsa alle cache di altri core. C'è qualche parte della loro semantica che mi è sfuggita e che tratta di questo?
Non capisco quello che non si ottiene. L'atomica ha la semantica [lock mutex globale; fare op; sblocca mutex globale]. Solo alcuni hanno un supporto intrinseco così fatto in modo implicito e veloce. –
Solo FYI - std :: atomic funziona con tutti i tipi di dati. In modo divertente, non si blocca se è troppo complicato, ma in quel caso ricade sulle serrature. Vedi la funzione membro 'is_lock_free()'. Tuttavia, devi stare attento se lo fai invece di serrature. –
Balog, comprendo la semantica dei mutex e capisco come gli atomici fanno quello che fanno, e capisco che in C++ 11 hanno ufficialmente una semantica extra che impedisce ai core diversi di mantenere i vecchi valori nella cache. Quello che non capisco è come fanno i mutex. Impediscono l'accesso simultaneo a una cosa, ma non ho letto nulla che affermi che la cosa avrà un valore coerente nella cache di diversi core. –