atomic_compare_exchange против mutex

Какой смысл в замене блокировки мьютекса блоком вот так

void stack_push(stack* s, node* n)
{
node* head;
do
{
head = s->head;
n->next = head;
}
while ( ! atomic_compare_exchange(s->head, head, n));
}

Не можете понять, какую выгоду мы можем получить, заменив мьютекс этим атомным обрывом?

6

Решение

Обычно это быстрее, чем мьютекс. При этом нельзя просто заменить все мьютексы на CAS. Один CAS безопасно поменяет одну ссылку на другую среди множества потоков.

Если у вас есть составная функция, в которой одна запись зависит от другой операции чтения (например), вам потребуется мьютекс для обеспечения атомарности.

6

Другие решения

Есть ряд преимуществ;

  1. это много быстрее (в Windows, например, в 10 или 100 раз — не так много в Linux, как на 10% лучше)
  2. это масштабируется МНОГО лучше (хотя все еще недостаточно — всего около 100 логических ядер)
  3. его МНОГО круче, и вы, кажется, гораздо умнее и способнее
  4. там, где не требуется ожиданий или снов, этот код можно использовать в местах, где запрещены ожидания или сны, например, обработчики прерываний, некоторые части ядер Windows (DISPATCH_LEVEL) и Linux и т. д.
13

По вопросам рекламы [email protected]