2014-04-02 41 views
1

使用信号量的关键部分的整个实现是我试图实现的。 使用信号量的全部代码被示出:使用信号量的有界缓冲区生产者 - 消费者代码

#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; 
} 

代码编译没有错误,但输出也不过是,它需要输入,然后thit只是显示1000点P1 1001 p2和类似

+0

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

回答

1

值你创建你的第一个生产者,然后立即等待它以join()结束,所以阻止你的主线程。该生产者在其for循环中运行,推动队列直到“空”信号没有更多单位,然后生产者阻塞。

主要和一个生产者线程现在都卡住了。其他生产者和所有消费者从未开始。没有消费者意味着无法从队列中弹出,所以整个过程都陷入僵局。

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

相关问题