使用信号量的有界缓冲生产者 - 消费者代码

时间:2014-04-02 09:44:21

标签: c synchronization pthreads semaphore producer-consumer

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

#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 个答案:

答案 0 :(得分:1)

您创建了第一个生成器,然后立即等待它以join()终止,因此阻止您的主线程。该生产者在其for循环中运行,推动队列,直到'空'信号量不再有单位,然后生产者阻塞。

主要和一个生产者线程现在都被卡住了。其他生产者和所有消费者从未开始。没有消费者没有任何东西可以从队列中弹出,所以整个地段都陷入僵局。

使用join()时这不是非典型的。