首页 > 代码库 > c 实现的 循环队列
c 实现的 循环队列
// // fs_loop_queue.h // fsnet // // Created by Vincent on 14-5-22. // Copyright (c) 2014年 Vincent. All rights reserved. // #ifndef fsnet_fs_loop_queue_h #define fsnet_fs_loop_queue_h #include "fs_define.h" struct fs_loop_queue; struct fs_loop_queue* fs_create_loop_queue(size_t len); fs_bool fs_loop_queue_push(struct fs_loop_queue*, void* item); void* fs_loop_queue_pop(struct fs_loop_queue*); fs_bool fs_loop_queue_full(struct fs_loop_queue*); fs_bool fs_loop_queue_empty(struct fs_loop_queue*); void fs_loop_queue_free( struct fs_loop_queue* ); #endif
// // fs_loop_queue.c // fsnet // // Created by Vincent on 14-5-22. // Copyright (c) 2014年 Vincent. All rights reserved. // #include <stdio.h> #include "fs_loop_queue.h" #include "fs_malloc.h" struct fs_loop_queue{ void** que; size_t head; size_t tail; size_t max_len; unsigned long script_id; }; #define _pos_add(x, n, max) x = (x + n) % max struct fs_loop_queue* fs_create_loop_queue(size_t len){ struct fs_loop_queue* queue = (struct fs_loop_queue*)fs_malloc(sizeof(*queue)); fs_zero(queue, sizeof(*queue)); queue->max_len = len; queue->que = fs_malloc( sizeof( void* ) * len ); fs_zero(queue->que, sizeof( void* ) * len); return queue; } fs_bool fs_loop_queue_push( struct fs_loop_queue* que, void* item){ if(fs_loop_queue_full(que)){ return fs_false; } que->que[que->head] = item; _pos_add(que->head, 1, que->max_len); return fs_true; } void* fs_loop_queue_pop( struct fs_loop_queue* que ){ if(fs_loop_queue_empty(que)){ return NULL; } void* item = que->que[que->tail]; que->que[que->tail] = NULL; _pos_add(que->tail, 1, que->max_len); return item; } fs_bool fs_loop_queue_full( struct fs_loop_queue* que ){ return ((que->head + 1) % que->max_len) == que->tail; } fs_bool fs_loop_queue_empty( struct fs_loop_queue* que ){ return que->head == que->tail; } void fs_loop_queue_free( struct fs_loop_queue* que){ fs_free(que->que); fs_free(que); }
这种循环队列, 在 A push B pop 是无锁的.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。