Какой смысл в замене блокировки мьютекса блоком вот так
void stack_push(stack* s, node* n)
{
node* head;
do
{
head = s->head;
n->next = head;
}
while ( ! atomic_compare_exchange(s->head, head, n));
}
Не можете понять, какую выгоду мы можем получить, заменив мьютекс этим атомным обрывом?
Обычно это быстрее, чем мьютекс. При этом нельзя просто заменить все мьютексы на CAS. Один CAS безопасно поменяет одну ссылку на другую среди множества потоков.
Если у вас есть составная функция, в которой одна запись зависит от другой операции чтения (например), вам потребуется мьютекс для обеспечения атомарности.
Есть ряд преимуществ;