Esistono due operazioni CAS CAS in C++ 11: atomic_compare_exchange_weak
e atomic_compare_exchange_strong
.Quando dovrebbe essere usato std :: atomic_compare_exchange_strong?
Secondo cppreference:
Le forme deboli delle funzioni sono autorizzati a sicuro falsamente, che è , agiscono come se * obj = * attesi anche se sono uguali!. Quando un confronto-e-scambio è in un ciclo, la versione debole produrrà prestazioni migliori su alcune piattaforme. Quando un confronto e scambio debole richiede e un circuito forte non lo richiede, quello forte è preferibile.
Il seguente è un esempio per l'utilizzo della deboli versione , penso:
do {
expected = current.value();
desired = f(expected);
} while (!current.atomic_compare_exchange_weak(expected, desired));
Qualcuno potrebbe dare un esempio in cui il confronto-e-scambio non è in un ciclo in modo che il è preferibile la versione forte?
Sembra che questo potrebbe accadere ogni volta che l'operazione non è stata critica. Diciamo che hai un certo numero di thread di lavoro che hanno un lavoro regolare che stanno facendo, ma stanno anche controllando il lavoro aggiuntivo in una coda. Se l'operazione CAS fa sembrare che la coda non possa essere bloccata, potrebbe non essere un grosso problema, dal momento che il lavoratore può continuare a svolgere il proprio lavoro regolare. –