3.12、生成者消费者模型

1.生产者消费者模型介绍

  • 生产者消费者模型是一种多线程的设计模式,用于解决生产者和消费者之间的同步和协作问题。

  • 在生产者消费者模型中,生产者和消费者通过共享一个缓冲区来交换信息。生产者向缓冲区中放置数据,消费者从缓冲区中取出数据。但是由于缓冲区是有限的,当生产者向缓冲区放置数据时,如果缓冲区已经满了,那么生产者就必须等待消费者从缓冲区中取出一些数据,以便为新数据腾出空间。同样的,当消费者从缓冲区中取出数据时,如果缓冲区为空,那么消费者就必须等待生产者向缓冲区中放置一些数据,以便取出。

  • 在生产者消费者模型中,线程间通信非常重要。为了保证数据的安全和正确性,需要使用同步和互斥机制来控制对共享缓冲区的访问。一般使用信号量或互斥锁来实现线程的同步和互斥。

在这里插入图片描述

2.一个没有实现线程同步的生产者消费者模型

/*
    实现生产者消费者模型
        - 不考虑容量大小会满
        - 不考虑消费者会消费完产品
        因此这是一个错误的生产者消费者模型
*/

#include <iostream>
#include <pthread.h>
#include <cstring>
#include <unistd.h>

using namespace std;

struct Node
{
    int num;
    struct Node * next;
};

struct Node * head = nullptr;

void * producer(void * arg)
{
    while (1)
    {
        struct Node * newNode = (struct Node *) malloc(sizeof (struct Node));
        newNode->num = rand() % 1000;
        newNode->next = head;
        head = newNode;
        printf("add: newNode->num: %d, tid: %ld\n", newNode->num, pthread_self());
        usleep(100);
    }
    pthread_exit(NULL);
}

void * customer(void * arg)
{
    while (1)
    {
        struct Node * Num = head;
        head = head->next;
        printf("del: Num->num: %d, tid: %ld\n", Num->num, pthread_self());
        free(Num);
        usleep(100);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t ptid[5], ctid[5];

    for (int i = 0; i < 5; i ++ )
    {
        pthread_create(&ptid[i], NULL, producer, NULL);
        pthread_create(&ctid[i], NULL, customer, NULL);
    }

    for (int i = 0; i < 5; i ++ )
    {
        pthread_detach(ptid[i]);
        pthread_detach(ctid[i]);
    }

    while (1)
    {
        sleep(10);
    }

    pthread_exit(NULL);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值