生产者-消费者解决方案运行但无法打印

问题描述

这是我当前的生产者-消费者问题代码。我编译并运行它,但没有打印任何内容。命令行包含3个参数:休眠时间,生产者线程,使用者线程。我尝试将值分别设置为5、1、1,睡眠定时器可以工作,但我不确定其余的时间。

buffer.h的代码

typedef int buffer_item;

#define BUFFER_SIZE 5

buffer.c的代码

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include "buffer.h"

buffer_item buffer[BUFFER_SIZE];
void *producer(void *param);
void *consumer(void *param);

pthread_mutex_t mutex;
sem_t empty;
sem_t full;


int insert_item(buffer_item item)
{
    do
    {
        wait(empty);
        wait(mutex);

        signal(mutex);
        signal(full);
    }while(1);

    return 0;
}

int remove_item(buffer_item *item)
{
    do
    {
        wait(full);
        wait(mutex);

        signal(mutex);
        signal(empty);
    }while(1);

    return 0;
}

int main(int argc,char *argv[])
{
    int sleepTime;
    int producerThreads;
    int consumerThreads;

    int counter_1;
    int counter_2;

    if(argc != 4)
    {
        return -1;
    }

    sleepTime = atoi(argv[1]);
    producerThreads = atoi(argv[2]);
    consumerThreads = atoi(argv[3]);

    srand((unsigned)time(NULL));

    for(counter_1 = 0; counter_1 < producerThreads; counter_1++)
    {
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&tid,&attr,producer,NULL);
    }

    for(counter_2 = 0; counter_2 < consumerThreads; counter_2++)
    {
        pthread_t tid;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_create(&tid,consumer,NULL);
    }

    sleep(sleepTime);

    return 0;
}

void *producer(void *param)
{
    buffer_item item;
    int randomTime;
    int counter_1 = 0;

    while(1)
    {
        randomTime = rand() % 1000 + 1;
        sleep(randomTime);

        item = rand();

        if(insert_item(item))
        {
            fprintf(stderr,"Error.");
        }
        else
        {
            printf("Producer ID: %lu,Produced Item: %d\n",pthread_self(),item);
            printf("The buffer Now contains %d items\n",counter_1);
            ++counter_1;
        }
    }

}

void *consumer(void *param)
{
    buffer_item item;
    int randomTime;
    int counter_2 = 0;

    while(1)
    {
        randomTime = rand() % 1000 + 1;
        sleep(randomTime);

        if(insert_item(item))
        {
            fprintf(stderr,"Error.");
        }
        else
        {
            printf("Consumer ID: %lu,Consumed Item: %d\n",counter_2);
            ++counter_2;
        }
    }
}

到目前为止,我已经尝试过分别声明tid,跳过睡眠并加入线程,但是仍然无法打印。

解决方法

您的代码可能无法运行,实际上甚至无法编译。 以下是需要解决的问题列表:

  • wait应该是sem_wait
  • 对于信号量,
  • signal应该为sem_post
  • int sem_wait(sem_t *sem);int sem_post(sem_t *sem);将指针指向信号量
  • sem_wait(mutex)sem_post(mutex)给出类似“ sem_wait的参数1的不兼容类型”的信息,我想您想获取并释放互斥锁,例如pthread_mutex_lock(&mutex)和{{1 }}
  • 在使用者pthread_mutex_unlock(&mutex)中:if(insert_item(item))未初始化使用
  • 在消费者中,您仍然使用item而不是insert_item

提到主要问题“我编译并运行了它,但没有打印任何内容” ,它没有打印任何内容,因为分别调用了remove_itemproducerconsumerinsert_item并陷入无限循环(例如remove_item

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...