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 是无锁的. 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值