C 无锁链表的实现
我正在尝试在C中实现一个无锁链表,这样您就可以使用create命令实例化多个无锁链表实例 代码如下: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
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会有帮助。我不清楚尾部指针的实际点是什么。这是一个单链表是吗?您应该只有头指针,列表数据结构只是指向数据和列表中下一个元素(如果有)的指针。名单上没有尾巴。您也不能在无锁数据结构上执行多个原子操作,除非每个原子操作都独立于其他原子操作。换句话说,试图在一行中做两件事,使用独立的原子操作并不能在原子上同时完成这两件事。