赞
踩
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAXSIZE 10
typedef int ElemType;
struct queue_type
{
ElemType buff[MAXSIZE];
ElemType front;
ElemType rear;
}Q;
pthread_mutex_t mutex;
sem_t sem_one;
sem_t sem_two;
void initial_queue(struct queue_type *q)
{
int i;
for (i = 0; i < MAXSIZE; i++)
{
q->buff[i] = 0;
}
q->front = 0;
q->rear = 0;
}
void *producer()
{
int i, num;
printf("the number to produce: \n");
scanf("%d", &num);
pthread_mutex_lock(&mutex);
for (i = 0; i < num; i++)
{
sem_wait(&sem_two);
Q.buff[Q.rear] = 1;
Q.rear = (Q.rear + 1) % MAXSIZE;
sem_post(&sem_one);
}
pthread_mutex_unlock(&mutex);
return NULL;
}
void *consumer()
{
int i, num;
printf("the number to consume: \n");
scanf("%d", &num);
pthread_mutex_lock(&mutex);
for (i = 0; i < num; i++)
{
sem_wait(&sem_one);
Q.buff[Q.front] = 0;
Q.front = (Q.front + 1) % MAXSIZE;
sem_post(&sem_two);
}
pthread_mutex_unlock(&mutex);
return NULL;
}
int main()
{
int i;
pthread_t id_p, id_c;
initial_queue(&Q);
pthread_mutex_init(&mutex, NULL);
sem_init(&sem_one, 0, 0);
sem_init(&sem_two, 0, MAXSIZE);
pthread_create(&id_p, NULL, producer, NULL);
pthread_join(id_p, NULL);
pthread_create(&id_c, NULL, consumer, NULL);
pthread_join(id_c, NULL);
pthread_mutex_destroy(&mutex);
sem_destroy(&sem_one);
sem_destroy(&sem_two);
printf("front : %d\n", Q.front);
printf("rear : %d\n", Q.rear);
for (i = 0; i < MAXSIZE; i++)
printf("%d ", Q.buff[i]);
printf("\n");
return 0;
}

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。