生产者消费者模型
概述
你好!如果你正在学习多线程方面的知识,这篇文章会帮助你进一步理解生产者消费者模型。如果你已经工作,可以将本篇文章中的源代码拿去稍加修改,应用到实际的工作需求中
在本篇文章中,我将假设你已经明白了互斥量的概念,如果还没有接触到多线程操作共享数据加锁的概念请跳过此文章。我们使用条件变量来实现生产者消费者模型。话不多说,我们直接进入正题!
首先我们需要知道什么是生产者和消费者,我们来做一个形象的比喻吧:假设你去一家披萨店吃披萨,为你生产披萨厨师们就是生产者线程,包括你在内需要吃披萨的顾客就是消费者线程,而披萨就是需要处理的数据
顾客想要吃这家的披萨,假设暂时没有披萨,就需要在此等待,厨师生产出了披萨会通知顾客
本次我们使用一个链表来模拟任务列表(披萨店),往链表插入数据的是生产者,从链表取走数据的是消费者
链表声明
#ifndef _LIST_H
#define _LIST_H
#ifdef __cplusplus
extern "C"{
#endif
//链表节点
typedef struct myListNode
{
void *data; //指向数据域
struct myListNode *next; //指向下一个节点
} NODE;
//链表操作结构体
typedef struct myList
{
int size; //节点数
NODE *head; //头节点
NODE *tail; //尾节点
} LIST;
//获取链表
LIST *list_init();
//清理链表及其所有元素
int list_destroy(LIST *list);
//插入节点(尾插)
int list_insert(LIST *list, void *data);
//删除节点(头删)
int list_delete(LIST *list);
//获取头节点数据
void *list_value(LIST *list);
#ifdef __cplusplus
}
#endif
#endif
链表实现
#include <stdlib.h>
#include "list.h"
//初始化链表
LIST *list_init()
{
LIST *list = (LIST *)malloc(sizeof(LIST));
if(list == NULL)
{
return NULL;
}
list->size = 0;
list->head = NULL;
list->tail = NULL;
return list;
}
//清理链表及其所有元素
int list_destroy(LIST *list)
{