#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_cond_t cond; //这里要用到条件变量
pthread_mutex_t mutex;
int ticketcount = 100;
void delay()
{
int i = 10000, j;
while(i > 0)
{
j = 10000;
while(j > 0)
{
j--;
}
i--;
}
}
void *ticketA(void *arg)
{
int cur_ticket;
while(1)
{
pthread_mutex_lock(&mutex);
cur_ticket = ticketcount;
delay();
if(cur_ticket <= 51) //条件变量的信号提醒
{
pthread_cond_signal(&cond);
}
if(cur_ticket <= 0)
{
pthread_mutex_unlock(&mutex);
break;
}
printf("A mai %d\n", cur_ticket);
cur_ticket--;
ticketcount = cur_ticket;
pthread_mutex_unlock(&mutex);
}
}
void *ticketB(void *arg)
{
int cur_ticket;
while(1)
{
pthread_mutex_lock(&mutex);
cur_ticket = ticketcount;
if(cur_ticket >= 51)
{
pthread_cond_wait(&cond, &mutex); //等待提醒
}
cur_ticket = ticketcount;
delay();
if(cur_ticket <= 0)
{
pthread_mutex_unlock(&mutex);
break;
}
printf("B mai %d\n", cur_ticket);
cur_ticket--;
ticketcount = cur_ticket;
pthread_mutex_unlock(&mutex);
}
}
int main()
{
int ret, i;
pthread_t tid[2];
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL); //初始化条件变量
ret = pthread_create(&tid[0], NULL, ticketA, NULL);
if(ret != 0)
{
perror("pthread_create");
exit(1);
}
ret = pthread_create(&tid[1], NULL, ticketB, NULL);
if(ret != 0)
{
perror("pthread_create");
exit(1);
}
void *status;
for(i = 0; i < 2; i++)
{
pthread_join(tid[i], &status);
}
pthread_cond_destroy(&cond); //销毁条件变量
pthread_mutex_destroy(&mutex);
return 0;
}