【问题标题】:A bounded buffer producer-consumer code using semaphore使用信号量的有界缓冲区生产者-消费者代码
【发布时间】:2014-05-13 12:03:42
【问题描述】:

使用信号量的关键部分的整个实现是我试图实现的。 显示了使用信号量的整个代码:

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

int buf[256];
int in = 0;
int out = 0;
sem_t full;
sem_t empty;
sem_t mutex;
int buf_size;
int counter = 0;

void *producer(void *arg)
{
    int i, item, *index;
    index = (int *)arg;
    for (i = 0;; i++)
    {
        item = 1000 + i;
        sem_wait(&empty);
        sem_wait(&mutex);
        buf[in] = item;
        in = (in + 1) % (*index);
        counter++;
        printf("\n%d [P%d] ", item, *index);
        sem_post(&mutex);
        sem_post(&full);
        /* if (i % 5 == 0)
            sleep(1); */
    }
}

void *consumer(void *arg)
{
    int i, item, *index;
    index = (int *)arg;
    for (i = 0;;i++)
    {
        sem_wait(&full);
        sem_wait(&mutex);
        item = buf[out];
        out = (out + 1) % (*index);
        counter--;
        printf("\n%d [C%d] ", item, *index);
        sem_post(&mutex);
        sem_post(&empty);
        /* if (i % 5 == 0)
            sleep(1); */
    }
}

int main()
{
    int produce, consume;
    int i;
    printf("\nThe Buffer Size:");
    scanf("%d", &buf_size);
    printf("\nThe Producer:");
    scanf("%d", &produce);
    printf("\nThe Consumer:");
    scanf("%d", &consume);
    pthread_t prod, cons;
    void* exit_status;
    sem_init(&full, 0, 0);
    sem_init(&empty, 0, buf_size);
    sem_init(&mutex, 0, 1);
    for (i = 0; i < produce; i++)
    {
        pthread_create(&prod, NULL, producer, &i);
    }
    for (i = 0; i < consume; i++)
    {
        pthread_create(&cons, NULL, consumer, &i);
    }
    pthread_join(prod, &exit_status);
    pthread_join(cons, &exit_status);
    // pthread_exit(NULL);
    return 0;
}

代码编译没有错误,但输出只是它所接受的输入,然后它只显示 1000 和 p1 1001 p2 以及类似的值

【问题讨论】:

  • 几点建议: 1. 告诉程序应该做什么。 2. 修复代码格式,它看起来真的很糟糕(并且,停止使用可怕的 TAB)。 3. 剪掉尽可能多的线条,只显示要点。

标签: c synchronization pthreads semaphore producer-consumer


【解决方案1】:

您创建了您的第一个生产者,然后立即等待它使用 join() 终止,因此阻塞了您的主线程。该生产者在其 for 循环中运行,推送队列直到“空”信号量没有更多单元,然后生产者阻塞。

主线程和一个生产者线程现在都卡住了。其他生产者和所有消费者永远不会启动。没有消费者意味着没有任何东西可以从队列中弹出,所以整个队列陷入僵局。

这在使用 join() 时并不少见。

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2016-06-29
    • 2018-05-05
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多