атомарные встроенные функции gcc

http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Atomic-Builtins.html

Я считаю, что следующий код увеличивает значение of var атомарно.

volatile int var = 0;
__sync_fetch_and_add( &var, 1 )

Я понял вышеупомянутые коды как следующую логику :

  1. Загрузить адрес переменной var
  2. записать число 1 в переменную var атомарно - через регистр / кеш, каким-то образом

Однако я сомневаюсь, что следующее также является атомарным

volatile int var = 0;
volatile int num = 1;
__sync_fetch_and_add( &var, num )

Поскольку это можно интерпретировать как

  1. Загрузить адрес переменной var
  2. Загрузить значение переменной num в регистр
  3. записать значение в переменная var.

После выполнения # 2, но до # 3, ЦП / поток прерывается, а другой ЦП / поток обновляется значение переменной num.

Другими словами, при использовании _ sync * () gcc, могу ли я использовать в качестве второго аргумента переменную, а не константу?

Разве это не нарушает атомарность?

23
задан ddoman 22 July 2011 в 06:23
поделиться