假设有一个有限缓冲区(包含8个单元)和两个线程:生产者和消费者。下列程序使用信号量来实现生产者和消费者线程之间的同步,请按要求完成下列操作。
1. 将程序补充完整。
2. 编译运行程序,并保存运行结果。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>#define__________________
void *producer(void *arg);
void *consumer(void *arg);
int queue[NUMBER];
sem_t blank_number, product_number;
int main(int argc, char *argv[])
{
        pthread_t pid, cid;
        sem_init(&blank_number, 0, NUMBER);
        sem_init(&product_number, 0, 0);
        pthread_create(&pid, NULL, producer, NULL);
        pthread_create(&cid, NULL, consumer, NULL);
pthread_join(pid, NULL);
        pthread_join(cid, NULL);
        sem_destroy(&blank_number);
        sem_destroy(&product_number);
}
void *producer(void *arg)
{
        int p = 0;
        while(1)
        {
_______________________________
_______________________________
_______________________________
_______________________________
_______________________________
sleep(_______________); //随机休眠1-5秒钟
        }
void *consumer(void *arg)
{
        int c = 0;
        while(1)
        {
_______________________________
_______________________________
_______________________________
_______________________________
_______________________________
sleep(_______________); //随机休眠1-5秒钟
        }
}

解决方案 »

  1.   

    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <semaphore.h>#define NUMBER 1void *producer(void *arg);
    void *consumer(void *arg);int queue[NUMBER];
    sem_t blank_number, product_number;int main(int argc, char *argv[])
    {
    pthread_t pid, cid;
    sem_init(&blank_number, 0, NUMBER);
    sem_init(&product_number, 0, 0);
    pthread_create(&pid, NULL, producer, NULL);
    pthread_create(&cid, NULL, consumer, NULL);
    pthread_join(pid, NULL);
    pthread_join(cid, NULL);
    sem_destroy(&blank_number);
    sem_destroy(&product_number);
    }
    void *producer(void *arg)
    {
    int p = 0;
    while(1)
    {
    sem_wait(&product_number);
    printf("生产1\n");
    sem_post(&blank_number);
    sleep(rand()%5); //随机休眠1-5秒钟
    }
    }
    void *consumer(void *arg)
    {
    int c = 0;
    while(1)
    {
    sem_wait(&blank_number);
    printf("消费1\n");
    sem_post(&product_number);
    sleep(rand()%5); //随机休眠1-5秒钟
    }
    }不明白什么叫有限缓冲区,但是代码大概是这个样子