head.h
#ifndef HEAD_H
#define HEAD_H
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
int resource;
pthread_mutex_t lock;
pthread_cond_t cond;
}threadData_t;
#endif
main.c
#include "head.h"
extern void* threadProducerFunc(void *p);
extern void* threadConsumerFunc1(void *p);
extern void* threadConsumerFunc2(void *p);
int main(int argc,char *argv[])
{
threadData_t threadData = {.resource = 5};
pthread_t threadProducer;
pthread_t threadConsumer1;
pthread_t threadConsumer2;
int ret = pthread_cond_init(&threadData.cond,NULL);
pthread_create(&threadProducer,NULL,threadProducerFunc,&threadData);
sleep(1);
pthread_create(&threadConsumer1,NULL,threadConsumerFunc1,&threadData);
pthread_create(&threadConsumer2,NULL,threadConsumerFunc2,&threadData);
pthread_join(threadProducer,NULL);
pthread_join(threadConsumer1,NULL);
pthread_join(threadConsumer2,NULL);
pthread_mutex_destroy(&threadData.lock);
pthread_cond_destroy(&threadData.cond);
return 0;
}
producer.c
#include "head.h"
void *threadProducerFunc(void *p)
{
threadData_t *pThreadData = (threadData_t*)p;
while(1)
{
/* sleep(3); */
pthread_mutex_lock(&pThreadData->lock);
if(0==pThreadData->resource)
{
pThreadData->resource = 100;
pthread_cond_broadcast(&pThreadData->cond);
printf("produce Tickets\n");
}
pthread_mutex_unlock(&pThreadData->lock);
}
pthread_exit(NULL);
}
consumer.c
#include "head.h"
void *threadConsumerFunc1(void *p)
{
threadData_t *pThreadData = (threadData_t*)p;
while(1)
{
pthread_mutex_lock(&pThreadData->lock);
if(0!=pThreadData->resource)
{
--pThreadData->resource;
printf("consumer1 sale one ticket\n");
if(0==pThreadData->resource)
{
pthread_cond_wait(&pThreadData->cond,&pThreadData->lock);
}
}
else
{
pthread_cond_wait(&pThreadData->cond,&pThreadData->lock);
}
pthread_mutex_unlock(&pThreadData->lock);
}
pthread_exit(NULL);
}
void *threadConsumerFunc2(void *p)
{
threadData_t *pThreadData = (threadData_t*)p;
while(1)
{
pthread_mutex_lock(&pThreadData->lock);
if(0!=pThreadData->resource)
{
--pThreadData->resource;
printf("consumer2 sale one ticket\n");
if(0==pThreadData->resource)
{
pthread_cond_wait(&pThreadData->cond,&pThreadData->lock);
}
}
else
{
pthread_cond_wait(&pThreadData->cond,&pThreadData->lock);
}
pthread_mutex_unlock(&pThreadData->lock);
}
pthread_exit(NULL);
}