#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<semaphore.h>
#include<sys/time.h>
#include<math.h>
#include<math.h>
//#include<iostream.h>
#define CHAIR 5
sem_t customers;
sem_t barbers;
pthread_mutex_t mutex;
int waiting=0;
void barber(void);
void customer(void *num);
void cut_hair(void);
double timediff(struct timeval I,struct timeval j);
void seed_random(void);
double flat(void);
double normal(void);
double bursty(void);
pthread_t id1,id2;
int main(void)
{
int i,ret=0;
// sem_init(&(sem_t)mutex,0,1);
sem_init(&customers,0,0);
sem_init(&barbers,0,1);
// pthread_t id1,id2;
seed_random();
//------------------- 初使化两个线程-------------------------------
ret=pthread_create(&id1,NULL,(void *)barber,NULL);//建立调用理发师线程
if(ret!=0)
printf("建立 barbers 错误");
while(1)
{
ret=pthread_create(&id2,NULL,(void *)customer,NULL);//建立调用顾客线程
printf("犯人:求你给我个痛快吧!T_T \n");
if(ret!=0)
printf("建立 customers 错误");
sleep(3);
}
}
double timediff(struct timeval now,struct timeval earlier)
{
if(now.tv_sec==earlier.tv_sec)
return (now.tv_usec-earlier.tv_usec)/1000000.0;
else
return (1000000*(now.tv_sec-earlier.tv_sec)+now.tv_usec-earlier.tv_usec)/1000000.0;
}
void barber(void)
{
while(1)
{
sem_wait(&customers);
pthread_mutex_lock(&mutex);
// sem_wait(&mutex);
waiting=waiting-1;
sem_post(&barbers);
pthread_mutex_unlock(&mutex);
// sem_post(&mutex);
cut_hair();
}
}
void cut_hair(void)
{
printf("刽子手:杀很大!我开始整了!\n");
usleep(10000000);/*理发时间*/
printf("刽子手:杀完了!\n");
}
void customer(void *num)
{
pthread_mutex_lock(&mutex);//共享变量加锁
// sem_post(&mutex);
if(waiting<CHAIR)
{
waiting=waiting+1;
printf("犯人坐在第%d个断头台上\n",waiting);
sem_post(&customers);
pthread_mutex_unlock(&mutex);
// sem_post(&mutex);
// sem_post(&customers);
sem_wait(&barbers);
}
else
{
printf("快滚把!没法给你痛快了,杀不过来了 ^-^ \n");
pthread_mutex_unlock(&mutex);
// sem_post(&mutex);
}
pthread_join(id2,NULL);
/*释放占用资源*/
}
void seed_random(void)
{
struct timeval randtime;
unsigned short xsubl[3];
gettimeofday(&randtime,(struct timezone *)0);
xsubl[0]=(ushort) randtime.tv_usec;
xsubl[1]=(ushort)(randtime.tv_usec>>16);
xsubl[2]=(ushort)(getpid());
seed48(xsubl);
}
double flat()
{
return drand48()/5;
}
double normal()
{
return sin(M_PI *drand48())/M_PI/2.006999;
}
double bursty()
{
return (sin(M_PI+drand48()*M_PI)+1)/3.591;
}