__sync_bool_compare_and_swap Флаги и компиляторы - PullRequest
1 голос
/ 17 мая 2011

Я работаю над структурой данных без блокировки и пытаюсь использовать указатели CAS.

При использовании сравнения и обмена какие флаги мне следует передавать в компилятор? Я получил лицензию на http://locklessinc.com/ распределитель памяти. Я также использую NetBeans 7.

В настоящее время единственные флаги, которые у меня есть, находятся под компоновщиком -march = native -lllalloc.

Однако, когда я запускаю программу, у меня возникают странные проблемы с памятью. Я думаю, что мне не хватает флага или двух ... Также netbeans говорит, что «не может разрешить идентификатор __sync_bool_compare_and_swap», но все равно компилирует его.

У кого-нибудь есть идеи?

Структура данных:

struct Ambigous
{
    short type;
    union{
        struct{
            bool inCleanup;
            KEY key;
            VALUE value;
        };
        Ambigous* volatile list[MAIN_SIZE];//CHANGED ordering, still have netbeans error
    };

};

Мой код сравнения и обмена

bool res= __sync_bool_compare_and_swap(&(local->list[pos]), current_node, new_node);

Как мне выделить память:

Ambigous *temp_spine = (Ambigous *) calloc(1,sizeof (Ambigous));

1 Ответ

2 голосов
/ 17 мая 2011

__sync_bool_compare_and_swap является присущим GCC. Вам не нужны никакие конкретные флаги компилятора; однако ваша IDE не сможет найти его определение, потому что оно не имеет его. И это может не работать на других компиляторах; например, компиляторы Visual Studio называют его InterlockedCompareExchange

Что касается вашей проблемы, трудно сказать, не увидев остальную часть вашего кода. Алгоритмы без блокировки очень сложно понять правильно; слишком легко пропустить какое-то маленькое состояние гонки. Придерживайтесь замков, если у вас нет веских причин поступить иначе.

...