Алгоритм на Atomic-функциях в GCC
От: phprus  
Дата: 21.06.11 15:11
Оценка:
Доброго времени суток!

Есть переменные 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 и общая логика вызовов А и В.
Re: Алгоритм на Atomic-функциях в GCC
От: TarasKo Голландия  
Дата: 21.06.11 16:27
Оценка: 6 (1)
Барьеров памяти нигде не вставлял, по идее они не нужны

На 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();
}
Re[2]: Алгоритм на Atomic-функциях в GCC
От: phprus  
Дата: 21.06.11 16:55
Оценка:
Здравствуйте, TarasKo, Вы писали:

TK>Барьеров памяти нигде не вставлял, по идее они не нужны

TK>...

Спасибо!
И как-это я сам не додумался до такого несложного алгоритма.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.