Доброго времени суток!
Есть переменные counter и n типа unsigned int. Нужно выполнить следующие действия:
1) Если n > counter, то передать управление на блок кода А
2) Если n <= counter, то выполнить counter = counter — n и передать управление на блок B.
Пример на С++:
unsigned int counter, n;
...
if (n > counter) {
A();
} else {
counter -= n;
B();
}
Скажите пожалуйста, возможно-ли реализовать логику работы с переменной counter при помощи Atomic-функций GCC? Как-либо синхронизировать блоки кода А и В не нужно, важно значение переменной counter и общая логика вызовов А и В.
Барьеров памяти нигде не вставлял, по идее они не нужны
На gcc atomic built-ins
volatile unsigned g_counter;
void foo(unsigned n)
{
bool run_a;
unsigned tmp;
do
{
unsigned tmp = g_counter;
run_a = n > tmp;
} while(!run_a && !__sync_bool_compare_and_swap(&g_counter, tmp, tmp - n);
if (run_a)
A();
else
B();
}
На std::atomic из С++0x.
std::atomic<unsigned> g_counter;
void foo(unsigned n)
{
bool run_a;
unsigned tmp = g_counter.fetch(std::memory_order_relaxed);
do
{
run_a = n > tmp;
} while(!run_a && !g_counter.compare_exchange_weak(tmp, tmp - n, std::memory_order_relaxed, std::memory_order_relaxed));
if (run_a)
A();
else
B();
}