条件变量实现生产者消费者模型

本文介绍如何利用条件变量实现生产者消费者模型,适合已了解互斥量概念的读者。通过披萨店的比喻,解释了生产者和消费者的角色,并用链表作为任务列表进行模拟。文章详细讲解了链表的声明与实现,以及如何在多线程环境中应用条件变量。
摘要由CSDN通过智能技术生成

生产者消费者模型

概述

你好!如果你正在学习多线程方面的知识,这篇文章会帮助你进一步理解生产者消费者模型。如果你已经工作,可以将本篇文章中的源代码拿去稍加修改,应用到实际的工作需求中

在本篇文章中,我将假设你已经明白了互斥量的概念,如果还没有接触到多线程操作共享数据加锁的概念请跳过此文章。我们使用条件变量来实现生产者消费者模型。话不多说,我们直接进入正题!

首先我们需要知道什么是生产者和消费者,我们来做一个形象的比喻吧:假设你去一家披萨店吃披萨,为你生产披萨厨师们就是生产者线程,包括你在内需要吃披萨的顾客就是消费者线程,而披萨就是需要处理的数据

顾客想要吃这家的披萨,假设暂时没有披萨,就需要在此等待,厨师生产出了披萨会通知顾客

本次我们使用一个链表来模拟任务列表(披萨店)往链表插入数据的是生产者,从链表取走数据的是消费者

链表声明

#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)
{
   
        
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中,可以使用C语言的条件变量和线程来实现消费者-生产者模型。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int count = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_prod = PTHREAD_COND_INITIALIZER; pthread_cond_t cond_cons = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int item = 0; while (1) { pthread_mutex_lock(&mutex); // 如果缓冲区已满,则等待消费者消费 while (count == BUFFER_SIZE) { pthread_cond_wait(&cond_prod, &mutex); } buffer[count] = item; count++; printf("Producer produced item %d\n", item); // 唤醒消费者线程 pthread_cond_signal(&cond_cons); pthread_mutex_unlock(&mutex); item++; } pthread_exit(NULL); } void *consumer(void *arg) { while (1) { pthread_mutex_lock(&mutex); // 如果缓冲区为空,则等待生产者生产 while (count == 0) { pthread_cond_wait(&cond_cons, &mutex); } int item = buffer[count - 1]; count--; printf("Consumer consumed item %d\n", item); // 唤醒生产者线程 pthread_cond_signal(&cond_prod); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { pthread_t producer_thread, consumer_thread; // 创建生产者和消费者线程 pthread_create(&producer_thread, NULL, producer, NULL); pthread_create(&consumer_thread, NULL, consumer, NULL); // 等待线程结束 pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL); return 0; } ``` 在上面的代码中,生产者线程不断地向缓冲区中生产数据,而消费者线程不断地从缓冲区中消费数据。当缓冲区满时,生产者线程会等待条件变量`cond_prod`,直到有消费者消费数据才会被唤醒。同样,当缓冲区为空时,消费者线程会等待条件变量`cond_cons`,直到有生产者生产数据才会被唤醒。 需要注意的是,在生产者和消费者线程之间共享的变量`count`和`buffer`需要进行互斥访问,因此使用了互斥锁`mutex`来保护共享资源的访问。 希望这个示例能帮助你理解如何在Linux中使用C语言的条件变量和线程实现消费者-生产者模型

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值