Код: Выделить всё
bool compare_exchange_weak (T& expected, T val, ..);
Код: Выделить всё
compare_exchange_weak()Но меня озадачивает то, что сказано в стандарте C++11 (ISO/IEC 14882),
29.6.5
..
Последствием ложного сбоя является то, что почти все использования слабого
сравнения и обмена будут зацикливаться.
Почему он должен быть в цикле почти во всех случаях ? Означает ли это, что мы будем зацикливаться, если произойдет сбой из-за ложных сбоев? Если это так, то зачем нам использовать Compare_exchange_weak() и писать цикл самостоятельно? Мы можем просто использовать Compare_exchange_strong(), который, я думаю, должен избавить нас от ложных сбоев. Каковы распространенные случаи использования Compare_exchange_weak()?
Еще один вопрос. В своей книге «Параллелизм в C++ в действии» Энтони говорит:
Код: Выделить всё
//Because compare_exchange_weak() can fail spuriously, it must typically
//be used in a loop:
bool expected=false;
extern atomic b; // set somewhere else
while(!b.compare_exchange_weak(expected,true) && !expected);
//In this case, you keep looping as long as expected is still false,
//indicating that the compare_exchange_weak() call failed spuriously.
Последний вопрос
На платформах, на которых не существует единой аппаратной инструкции CAS, как слабая, так и сильная версия реализуются с использованием LL/SC (например, ARM, PowerPC и т. д.). Итак, есть ли разница между следующими двумя циклами? Почему, если таковые имеются? (На мой взгляд, они должны иметь схожую производительность.)
Код: Выделить всё
// use LL/SC (or CAS on x86) and ignore/loop on spurious failures
while (!compare_exchange_weak(..))
{ .. }
// use LL/SC (or CAS on x86) and ignore/loop on spurious failures
while (!compare_exchange_strong(..))
{ .. }
Когда сравнение и обмен выполняется в цикле, слабая версия обеспечит
более высокую производительность на некоторых платформах.
Но, как анализировалось выше, две версии в цикле должны давать одинаковую/похожую производительность. Чего мне не хватает?
Подробнее здесь: https://stackoverflow.com/questions/251 ... eak-in-c11
Мобильная версия