【问题标题】:Producer-Consumer solution runs but doesn't print生产者-消费者解决方案运行但不打印
【发布时间】:2020-08-22 17:25:55
【问题描述】:

这是我当前的生产者-消费者问题代码。我编译并运行它,但没有打印任何内容。命令行接受 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, &attr, 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", pthread_self(), item);
            printf("The buffer now contains %d items\n", counter_2);
            ++counter_2;
        }
    }
}

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

【问题讨论】:

  • 您的代码编译。对于wait,您需要#include &lt;sys/wait.h&gt;,对于signal,您需要#include &lt;signal.h&gt;。但是,您以非标准方式使用这些标准功能。您没有提供这些函数的您的 版本的定义。如果这是您的意图,您应该将它们重命名为不冲突的名称。而且,您将 [按值] 传递 sem_tpthread_mutex_t 到同一个函数。而且,按值传递可能不是您想要的,因为对 arg 的任何更改都不会持续存在。你想要(例如):myfunc(&amp;empty)

标签: c producer-consumer


【解决方案1】:

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

  • 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(&amp;mutex)pthread_mutex_unlock(&amp;mutex)
  • 在消费者if(insert_item(item))item未初始化使用
  • 仍然在消费者中使用insert_item 而不是remove_item

来到主要问题“我编译并运行它,但没有打印任何内容”,它不打印任何内容,因为 producerconsumer 分别调用 insert_itemremove_item 并被困在无限循环中(例如while(1)

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2020-04-08
    • 2020-02-14
    相关资源
    最近更新 更多