У меня есть следующий изолированный тестовый фрагмент внутри проекта iOS:
/// ...
std::atomic_bool ab;
ab.store(true);
bool expected = false;
while (!ab.compare_exchange_weak(expected, true));
assert(0);
// ...
При условии, что ab
я не ожидал, что цикл будет бесконечным, но после выполнения я обнаружил, что assert
терпит неудачу. Почему это происходит?
compare_exchange_weak
изменяет первый параметр на то, что было на самом деле там. Таким образом, после первой итерации ожидаемый цикл был изменен на true
, Это затем подается обратно в цикл, где compare_exchange_weak
успешно и продолжает проваливать утверждение.
Если ничего не трогает ab
и ничего не трогает expected
(и не запущены никакие другие потоки, которые могли бы поразить память этой области), тогда это утверждение не должно запускаться …
если компилятор не помогает вам, устраняя мертвый код, т.е. while
цикл ничего не делает, поэтому не включайте его и, следовательно, вы нажмете на assert. Чтобы убедиться в этом, проверьте вывод на ассемблере или добавьте глобальный переменный счетчик в цикл, чтобы компилятор не убивал этот мертвый код за вас.