#include <stdio.h>
#include “head.h”
int j = 0;
sem_t sem1,sem2,sem3,sem4,sem5; //聲明信号量
void *fun1(void * arg)
{
int i =0,*tmp = 0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem1); //按給定有效值1來順序執行
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem2);//釋放信号并給下一個
pthread_exit(0);
}
printf(“一視窗售号為: %d \n”,str[*n]);
(*n)++;
sem_post(&sem2);
}
else
{
// sleep(1);
}
}
}
void *fun2(void * arg)
{
int i =0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem2);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem3);
pthread_exit(0);
}
printf(“二視窗售号為: %d \n”,str[*n]);
(*n)++;
sem_post(&sem3);
}
else
{
// sleep(1);
}
}
}
void *fun3(void * arg)
{
int i =0,*tmp = 0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem3);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem4);
pthread_exit(0);
}
printf(“三視窗售号為: %d \n”,str[*n]);
(*n)++;
sem_post(&sem4);
}
else
{
// sleep(1);
}
}
}
void *fun4(void * arg)
{
int i =0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem4);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem5);
pthread_exit(0);
}
printf(“四視窗售号為: %d \n”,str[*n]);
(*n)++;
sem_post(&sem5);
}
else
{
// sleep(1);
}
}
}
void *fun5(void * arg)
{
int i =0,*tmp = 0;
int *n = &j;
int *str = (int *)arg;
while(1)
{
int ret = sem_trywait(&sem5);
if(ret == 0)
{
if(*n > 99)
{
sem_post(&sem1);
pthread_exit(0);
}
printf(“五視窗售号為: %d \n”,str[*n]);
(*n)++;
sem_post(&sem1);
}
else
{
// sleep(1);
}
}
}
int main(int argc, char *argv[])
{
int buff[100] = {0},i = 0,p = 1;
for(i=0;i<100;i++)
{
buff[i] = p;
p++;
}
sem_init(&sem1,0,1); //初始化信号量
sem_init(&sem2,0,0);
sem_init(&sem3,0,0);
sem_init(&sem4,0,0);
sem_init(&sem5,0,0);
pthread_t tid1 = 0,tid2 = 0,tid3 = 0,tid4 = 0,tid5 = 0;//初始化線程
pthread_create(&tid1,NULL,fun1,(void *)buff);//線程的建立
pthread_create(&tid2,NULL,fun2,(void *)buff);
pthread_create(&tid3,NULL,fun3,(void *)buff);
pthread_create(&tid4,NULL,fun4,(void *)buff);
pthread_create(&tid5,NULL,fun5,(void *)buff);
pthread_join(tid1,NULL); //線程的回收
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
pthread_join(tid4,NULL);
pthread_join(tid5,NULL);
return 0;
}