1

我正在研究无锁数据结构,并尝试使用 CAS 指针。

使用比较和交换时,我应该将哪些标志传递给编译器?我已经获得了http://locklessinc.com/内存分配器的许可证。我也在使用netbeans 7。

目前我唯一的标志是在链接器下,-march=native -llllalloc。

但是,当我运行该程序时,我会遇到奇怪的内存问题。我想我可能缺少一个或两个标志... 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));
4

1 回答 1

3

__sync_bool_compare_and_swap是 GCC 内在函数。您不需要任何特定的编译器标志;但是,您的 IDE 将无法找到它的定义,因为它没有定义。它可能不适用于其他编译器;例如,Visual Studio 编译器调用它InterlockedCompareExchange

至于你的问题出在哪里,如果没有看到你的其余代码就很难说。无锁算法很难正确处理;错过一些小的比赛条件太容易了。除非您有充分的理由不这样做,否则请坚持使用锁。

于 2011-05-16T21:44:24.800 回答