C语言 - 数据队列(Queue)设计

C语言 - 数据队列设计

原理

最基础的使用Demo

// 再次封装一层 queue.
typdef struct {
   
   
    int size;              // 描述 buffer 多大
    audio_queue_t queue;   // queue 实体
    char *base;          // buffer 实体
}Queue;

Queue *q = malloc(sizeof(Queue));
// 1. 初始化 queue buffer
q->size = 1024;
q->base= malloc((sizeof(audio_queue_t ) + q->size + 1 * sizeof(char)));
if (!q->base) {
   
   
	goto err_malloc_queuebuffer;
}
q->queue = queue_init(q->base, q->size + 1);

// 2. 将数据写入 queue
Queue *q = getQueue(xxx);
queue_write(q->queue, data, data_size);

// 3. 读取 queue 里面的数据
Queue *q = getQueue(xxx);
queue_read(q->queue, outbuffer, outsize);

// 4. 释放 queue
Queue *q = getQueue(xxx);
if (NULL != q->queue) {
   
   
	queue_destroy(q->queue);
	q->queue = NULL;
	free(q->base);
	q->base= NULL;
}
free(q);

代码

  • 头文件定义
/*
 * AudioQueue.h
 *
 *  Created on: 2015年8月17日
 *      Author: ican
 */

#ifndef AUDIOQUEUE_H_
#define AUDIOQUEUE_H_

#include <string.h>
#include <pthread.h>
#include <stdbool.h>

/**
 * 队列数据结构:|***控制块***|***数据区***|
 */
typedef struct audio_queue_t {
   
   
	pthread_mutex_t mutex;		// 互斥锁
	pthread_cond_t cond;		// 条件锁
	int capacity;				// 队列容量
	int front;					// 队头索引
	int rear;					// 队尾索引
	int more;					// 写完标记
} audio_queue_t;

#ifdef __cplusplus
extern "C" {
   
   
#endif

/**
 * 将一块内存初始化为队列数据结构
 *
 * base 分配给队列的内存块首地址,内存长度为sizeof(audio_queue_t) + capacity
 * capacity 队列数据区大小,队列实际容量为capacity - 1
 */
audio_queue_t* queue_init(void* base, int capacity);

char* queue_get_write_addr(audio_queue_t* queue);

void queue_destroy(audio_queue_t* queue);

int queue_real_capacity(audio_queue_t* queue);

int queue_front(audio_queue_t* queue);

int 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值