C 无锁链表的实现

C 无锁链表的实现,c,linked-list,lockless,C,Linked List,Lockless,我正在尝试在C中实现一个无锁链表,这样您就可以使用create命令实例化多个无锁链表实例 代码如下: typedef struct node_s node_t; struct node_s { node_t *next; void *data; uint32_t tag; }; typedef struct list_s list; struct list_s { node_t *head; node_t *tail; }; list *create_q

我正在尝试在C中实现一个无锁链表,这样您就可以使用create命令实例化多个无锁链表实例

代码如下:

typedef struct node_s node_t;
struct node_s {
    node_t *next;
    void *data;
    uint32_t tag;
};
typedef struct list_s list;
struct list_s
{
    node_t *head;
    node_t *tail;
};

list *create_queue(void){
    list* _list =NULL;
    _list = (list*)malloc(sizeof(list));
    node_t *head = NULL;
    node_t *tail = NULL;
    head = (node_t*)malloc(sizeof(node_t));
    if (!head) {
        fprintf(stderr, "malloc error\n");
        return NULL;
    }
    head->next = NULL;
    head->data = NULL;
    tail = head;
    _list->head = head;
    _list->tail = head;
    return _list;
}



node_t* enqueue(void *d, list *_list)
{
    if (_list == NULL)
    {
        fprintf(stderr, "List error\n");
        return NULL;
    }
    node_t *p = (node_t*)malloc(sizeof(node_t));
    if (!p) {
        fprintf(stderr, "malloc error\n");
        return NULL;
    } 
    p->next = NULL;
    p->data = d;
    node_t *q;
    do {
        q =  &_list->tail;
    } while (!__sync_bool_compare_and_swap(&(q->next), NULL, p));
    __sync_bool_compare_and_swap( &(_list->tail), q, p);
    return p;
}



void* dequeue(list *_list)
{
    node_t *p;
    void *res;
    if (_list ==NULL)
    {
        fprintf(stderr, "List error\n");
        return NULL;
    }

    do {
        p = _list->head;
        if (p->next == NULL){
            return NULL;
        }
         res = p->next->data;
    } while(!__sync_bool_compare_and_swap(&_list->head, p, p->next));
    if (p) {
        free(p);
        p = NULL;
    }
    return res;
}
问题是,当我尝试使用排队然后随后退出时,它给出了一个分段错误。因此,如果你能指出这个问题,那将非常有帮助


任何帮助都将不胜感激

q=&u list->tail-->
q=\u列表->尾部
q
是一种
节点*
类型,
\U列表->尾部
是一种
节点*
类型,
q=&U列表->尾部尝试将
节点**
类型分配给
节点*
类型。我希望编译器会发出警告。这并不是对你问题的真正回答,但看起来你正在使用GCC的原子内置。自C11以来,该语言具有官方原子支持,无需使用编译器扩展。如果我执行q=\u list->tail;。它在带有seg故障的while回路中失败。问题可能是什么?可能您需要在此处键入
节点**
,在这种情况下,请更改
节点*q
节点*q。类型必须匹配您需要在那里进行的任何分配。不知道
\u sync\u bool\u compare\u和\u swap
函数在做什么,MCVE会有帮助。我不清楚尾部指针的实际点是什么。这是一个单链表是吗?您应该只有头指针,列表数据结构只是指向数据和列表中下一个元素(如果有)的指针。名单上没有尾巴。您也不能在无锁数据结构上执行多个原子操作,除非每个原子操作都独立于其他原子操作。换句话说,试图在一行中做两件事,使用独立的原子操作并不能在原子上同时完成这两件事。