http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Atomic-Builtins.html
Я считаю, что следующий код увеличивает значение var атомарно.
volatile int var = 0;
__sync_fetch_and_add( &var, 1 )
Я понял приведенные выше коды как следующую логику:
- Загрузите адрес переменной var
- напишите номер 1 на переменную var atomically - через регистр/кеш, как-то
Однако, я сомневаюсь, что следующее атомарное тоже
volatile int var = 0;
volatile int num = 1;
__sync_fetch_and_add( &var, num )
Так как это можно интерпретировать как
- Загрузите адрес переменной var
- Загрузите значение переменной num в регистр
- записать значение в переменную var.
После выполнения # 2, но до # 3, CPU/thread прерывается, а другие обновления CPU/потока значение переменной num.
Другими словами, при использовании _sync *() gcc, могу ли я использовать переменную, а не константу, как второй аргумент?
Разве это не разрушает атомарность?