Linux生产/消费者模型库-B队列

Linux生产/消费者模型库-B队列

这是我写的一个非常简单的生产者和消费者模型库,虽然简单,但我还是给它起了个名字—–B队列,意为Blocking queue(阻塞队列)。内部是采用Linux信号量实现的,可以用来实现基础的生产者和消费者模型,比如:简单的线程池等。

项目地址:https://github.com/liangdodo/bqueue

静态库:bqueue.zip

一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include "bqueue.h"

//生产者线程
void* producer_thread(void *ptr){
	struct bqueue_t *bq=(struct bqueue_t*)ptr;
	int data,i=1001;
	
	printf("生产者已启动生产...\n");
	
	for(;;){
		//生产者隔5秒生产一个int数据 放入到队列
		sleep(5);
		bqueue_push(bq,&i);
		i++;
	}
	
	return NULL;
}

//消费者线程
void* consumer_thread(void *ptr){
	struct bqueue_t *bq=(struct bqueue_t*)ptr;
	int data;
	
	printf("消费者已启动消费...\n");
	
	for(;;){
		//从b队列里面取出一个元素放入到data变量中,若队列为空,则阻塞
		bqueue_pop(bq,&data);
		printf("消费者从队列里面拿出了一个元素:%d\n",data);
	}
	
	return NULL;
}


int main(int argc,char *argv[]){
	
	struct bqueue_t bqueue;//定义一个b队列
	pthread_t producer_tid,consumer_tid;//生产、消费者的线程tid
	
	//初始化一个数量为100b队列,队列中的每个数据元素为int类型(sizeof(int))
	bqueue_init(&bqueue,sizeof(int),100);
	//创建生产者线程
	pthread_create(&producer_tid,NULL,producer_thread,&bqueue);
	//创建消费者线程
	pthread_create(&consumer_tid,NULL,consumer_thread,&bqueue);
	
	//等待线程结束
	pthread_join(producer_tid,NULL);
	pthread_join(consumer_tid,NULL);
	//销毁b队列
	bqueue_destroy(&bqueue);
	return 0;
}

编译+运行

gcc -o demo main.c -l pthread -L ./ -l bqueue
./demo

当然,这个程序永远无法结束,所以就请您Ctrl+c 一下了,(#^.^#)

基本操作说明:

/**
* 初始化B队列
* bq : B队列指针
* data_size:队列中每个元素的尺寸,通常使用sizeof(数据类型)得到
* max_length:队列中可容纳的最大元素个数
* 返回值:成功返回 0 ,失败返回 -1
*/
int bqueue_init(struct bqueue_t *bq,int data_size,int max_length);

/**
* 销毁B队列
* bq:B队列指针
*/
void bqueue_destroy(struct bqueue_t *bq);

/**
* 在B队列末尾增加一个元素,若队列已经满了,则该函数会阻塞
* bq:B队列指针
* data:增加的数据元素指针,注:该地址所指向的类型尺寸应该和bqueue_init()初始化函数中的data_size值相同。
* 返回值:成功返回 0 ,失败返回 -1
*/
int bqueue_push(struct bqueue_t *bq,void *data);

/**
* 将B队列最前面的一个元素取出
* bq:B队列指针
* data:取出元素所存放的地址,如果不关心其值,可以将其设置为NULL。注:该地址所指向的类型尺寸应该和bqueue_init()初始化函数中的data_size值相同。
* 返回值:成功返回 0 ,失败返回 -1
*/
int bqueue_pop(struct bqueue_t *bq,void *data);

/**
* 获得B队列中有效元素个数
* bq:B队列指针
* 返回值 :元素个数
*/
int bqueue_length(struct bqueue_t *bq);

/**
* 获得B队列头部的元素内容(不取出)
* bq:B队列指针
* buf: 取出元素所存放的地址
* 返回值:成功返回 0 ,失败返回 -1
*/
int bqueue_head(struct bqueue_t *bq,void *buf);

/**
* 获得B队列尾部的元素内容(不取出)
* bq:B队列指针
* buf: 取出元素所存放的地址
* 返回值:成功返回 0 ,失败返回 -1
*/
int bqueue_tail(struct bqueue_t *bq,void *buf);

/**
* 清空B队列
* bq:B队列指针
*/
void bqueue_clear(struct bqueue_t *bq);

/**
* 创建一个B队列节点
* bq:B队列指针
* data://节点中缩放数据内容指针
* 返回值,成功返回节点指针,失败返回NULL
*/
struct bqueue_node_t * bqueue_make_node(struct bqueue_t *bq,void *data);

/**
* 释放一个B队列节点
* bq_node:节点指针
*/
void bqueue_free_node(struct bqueue_node_t *bq_node);

/**
* 遍历B队列,且执行回调
* bq:B队列指针
* call:回调函数指针,声明为:void xxx(void *data)
*/
void bqueue_traverse(struct bqueue_t *bq,void (*call)(void *data));

/**
* 获得B队列中还能容纳下多少元素个数(剩余空间)
* bq:B队列指针
* 返回值:还能容纳下的空闲元素个数
*/
int bqueue_get_free(struct bqueue_t *bq);

2 thoughts on “Linux生产/消费者模型库-B队列

发表回复