C ++ атомарный на iOS

У меня есть следующий изолированный тестовый фрагмент внутри проекта iOS:

/// ...
std::atomic_bool ab;
ab.store(true);
bool expected = false;
while (!ab.compare_exchange_weak(expected, true));
assert(0);
// ...

При условии, что ab я не ожидал, что цикл будет бесконечным, но после выполнения я обнаружил, что assert терпит неудачу. Почему это происходит?

0

Решение

compare_exchange_weak изменяет первый параметр на то, что было на самом деле там. Таким образом, после первой итерации ожидаемый цикл был изменен на true, Это затем подается обратно в цикл, где compare_exchange_weak успешно и продолжает проваливать утверждение.

1

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

Если ничего не трогает ab и ничего не трогает expected(и не запущены никакие другие потоки, которые могли бы поразить память этой области), тогда это утверждение не должно запускаться …

если компилятор не помогает вам, устраняя мертвый код, т.е. while цикл ничего не делает, поэтому не включайте его и, следовательно, вы нажмете на assert. Чтобы убедиться в этом, проверьте вывод на ассемблере или добавьте глобальный переменный счетчик в цикл, чтобы компилятор не убивал этот мертвый код за вас.

0