使用互斥锁解决有界缓冲区问题

问题描述 投票:0回答:1

这里是新手。我正在对 C 编程中的有界缓冲区问题进行分配。我尽可能不使用库来更好地理解解决方案。

到目前为止我有这个

#include <stdio.h>
#include <stdlib.h>

int mutex = 1;
int full = 0;
int empty = 10, buffer[10];
int i;

void producer()
{
    --mutex;
    ++full;
    --empty;
    printf("\nProduce:");
    scanf("%d", &buffer[i]);
    i++;
    ++mutex;
}

void consumer()
{
    --mutex;
    --full;
    ++empty;
    i=0;
    printf("\nConsume: %d", buffer[i]);
    i--;
    ++mutex;
}

int main()
{
    int n, i;
    printf("\n[1] Producer \n[2] Consumer \n[3] Exit");
    
    for (i = 1; i > 0; i++)
    {
        printf("\nEnter your choice: ");
        scanf("%d", &n);
        switch (n)
        {
        case 1:
            if ((mutex == 1) && (empty != 0))
            {
                producer();
            }
            else
            {
                printf("\nThe Buffer is full, please do not enter new data");
            }
            break;

        case 2:
            if ((mutex == 1) && (full != 0))
            {
                consumer();
            }
            else
            {
                printf("\nThe Buffer is empty, please consume new data");
            }
            break;
        case 3:
            exit(0);
            break;
        }
    }
}

在这里,我将缓冲区设为接受输入的数组。我的问题是我想在

printf("\nConsume: %d", buffer[i]); i--;
中以递减顺序打印消费数据。我哪里做错了?很抱歉,我还在学习数组。

arrays buffer mutex
1个回答
0
投票

您可以使用 sizeof() 来查找当前缓冲区中的元素数量,然后在消费者函数中将 i 设置为该值。

size_t no_of_elements = sizeof(buffer)/sizeof(buffer[0]); i = no_of_elements;

然后在递减 i 的同时打印。

PS:你在消费者中设置了i=0,这可能会导致生产者代码中的值被覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.