/*
compile:
g++ -D_REENTRANT -lpthread xx.cpp
*/
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
int ticket = 20;
sem_t mutex;
void* thread_function(void* p)
{
while (1)
{
sem_wait(&mutex);
if (ticket > 0)
printf("%s sell the %dth ticket.\n", (char*)p, ticket--);
else
{
sem_post(&mutex);
break;
}
sem_post(&mutex);
sleep(1);
}
return NULL;
}
int main()
{
sem_init(&mutex, 0, 1);
pthread_t t1, t2, t3;
pthread_create(&t1, NULL, thread_function, (void*)"WINDOW 1");
pthread_create(&t2, NULL, thread_function, (void*)"WINDOW 2");
pthread_create(&t3, NULL, thread_function, (void*)"WINDOW 3");
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
sem_destroy(&mutex);
return 0;
}