Il motivo principale dell'utilizzo di atomici su mutex è che i mutex sono costosi ma con il modello di memoria predefinito per atomics
è memory_order_seq_cst
, non è altrettanto costoso?La sincronizzazione con `std :: mutex` è più lenta rispetto a` std :: atomic (memory_order_seq_cst) `?
Domanda: Un programma simultaneo che utilizza i blocchi può essere veloce quanto un programma senza blocco simultaneo?
In tal caso, potrebbe non valerne la pena, a meno che non voglia utilizzare memory_order_acq_rel
per gli atomici.
Edit: io possa mancare qualcosa, ma non posso blocco a base di essere più veloce di libero lock-perché ogni blocco dovrà essere una barriera di memoria piena troppo. Ma con lock-free, è possibile utilizzare tecniche che sono meno restrittive rispetto alle barriere della memoria.
Quindi, tornando alla mia domanda, è il blocco più veloce del blocco basato sul nuovo standard C++ 11 con il valore predefinito memory_model
?
"lock-free> = lock-based quando misurato in prestazioni" vero? Supponiamo 2 thread hardware.
Edit 2: La mia domanda non riguarda le garanzie di progresso, e forse sto usando "lock-libero" fuori contesto.
Fondamentalmente quando si hanno 2 thread con memoria condivisa, e l'unica garanzia che è necessario è che se un thread sta scrivendo l'altro thread non può leggere o scrivere, il mio presupposto è che una semplice operazione atomica compare_and_swap
sarebbe molto più veloce del blocco di un mutex.
Perché se un thread non tocca mai nemmeno la memoria condivisa, si arriverà a bloccarsi e sbloccarsi più e più volte senza motivo, ma con le operazioni atomiche si usa solo 1 ciclo CPU ogni volta.
Per quanto riguarda i commenti, uno spin-lock rispetto a un mutex-lock è molto diverso quando c'è molto poco contesa.
Bene, ci sono diverse garanzie di progresso tra blocchi, codice senza blocco e codice senza attesa. –
[Lettura obbligatoria] (http://www.1024cores.net/home/lock-free-algorithms). –
watch: https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl