ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

环形缓冲池模拟

2021-11-09 12:59:50  阅读:144  来源: 互联网

标签:int 缓冲 signal 环形 mutex pthread sem 模拟 buff


//cd 桌面
//g++ producerAndConsumer.c -o producerAndConsumer -lpthread
//./producerAndConsumer


#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <malloc.h>
#include <semaphore.h>
#include <unistd.h>
using namespace std;
#define SIZE 8
int buff[SIZE];
int *rear=buff;
int *front=buff;
pthread_mutex_t mutex[SIZE];//互斥信号量
sem_t signal_produce; //信号量
sem_t signal_consume;
int n,m;
void* produce(void *)
{
    while(1){
        sem_wait(&signal_produce);//非0的时候-1
        pthread_mutex_lock(&mutex[rear-buff]);
    int* Rear = rear; //如果不这样做可能会导致多个线程同时修改rear的值导致这个线程中后面使用的rear值都是错误的
    if(rear==buff+SIZE-1)//用数组来模拟环形队列
        rear=buff;
    else
            rear++;
        sleep(5);
    *Rear=1;
    printf("\n生产者装入 %d\n", Rear-buff);
    for(int i=0; i<SIZE; i++){//打印缓冲池
        printf("%d ", buff[i]);
    }
    printf("\n");
    pthread_mutex_unlock(&mutex[Rear-buff]);      
    sem_post(&signal_consume); //信号量+1
    int value_p=0;//打印信号量
    int value_c=0;
    sem_getvalue(&signal_produce, &value_p);
    printf("signal_produce:%d\n", value_p);
    sem_getvalue(&signal_consume, &value_c);
    printf("signal_consume:%d\n", value_c);
    }
}
void* consume(void *)
{
    while(1){
        sem_wait(&signal_consume);
        pthread_mutex_lock(&mutex[front-buff]);
    int* Front = front;
        if(front==buff+SIZE-1)
        front=buff;
    else
            front++;
        sleep(2);
    *Front=0;
    printf("\n消费者取走 %d\n", Front-buff);
    for(int i=0; i<SIZE; i++){
        printf("%d ", buff[i]);
    }
    printf("\n");
    pthread_mutex_unlock(&mutex[Front-buff]);
        sem_post(&signal_produce);
    int value_p=0;
    int value_c=0;
    sem_getvalue(&signal_produce, &value_p);
    printf("signal_produce:%d\n", value_p);
    sem_getvalue(&signal_consume, &value_c);
    printf("signal_consume:%d\n", value_c);
    }
}
int main(int argc, char const *argv[]) {
    printf("请输入生产者个数: ");
    scanf("%d",&n);
    printf("请输入消费者个数: ");
    scanf("%d",&m);
    pthread_t* thread_producer=(pthread_t*)malloc(sizeof(pthread_t)*n);
    pthread_t* thread_consumer=(pthread_t*)malloc(sizeof(pthread_t)*m);
    for(int i=0;i<SIZE;i++)
    pthread_mutex_init(&mutex[i],NULL);
    sem_init(&signal_produce,0,SIZE);//信号量初始化表示资源数目
    sem_init(&signal_consume,0,0);
    for(int i=0;i<SIZE;i++)
        buff[i]=0;
    for(int i=0;i<n;i++)
        pthread_create(&thread_producer[i],NULL,produce,NULL);
    for(int i=0;i<m;i++)
       pthread_create(&thread_consumer[i],NULL,consume,NULL);
    for(int i=0;i<n;i++)
        pthread_join(thread_producer[i],NULL);
    for(int i=0;i<m;i++)
        pthread_join(thread_consumer[i],NULL);
    free(thread_producer);
    free(thread_consumer);
    for(int i=0;i<SIZE;i++)
    pthread_mutex_destroy(&mutex[i]);
    sem_destroy(&signal_produce);
    sem_destroy(&signal_consume);
    return 0;
}

标签:int,缓冲,signal,环形,mutex,pthread,sem,模拟,buff
来源: https://blog.csdn.net/ValourGaobaa/article/details/121225605

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有