#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
int count=30;
pthread_mutex_t mutex;
pthread_cond_t a_finish;
pthread_cond_t b_finish;
pthread_cond_t c_finish;
int flag=1;
void * func_a(void)
{
while(1)
{
pthread_mutex_trylock(&mutex);
if(flag == 1)
{
flag=0;
sleep(1);
printf("count in a=%d\n",count);
printf("A\n");
count--;
}
else
{
if(count > 0)
{
pthread_cond_wait(&c_finish,&mutex);
sleep(1);
printf("count in a=%d\n",count);
printf("A\n");
count--;
}
else
{
pthread_cond_signal(&a_finish);
pthread_mutex_unlock(&mutex);
break;
}
}
pthread_cond_signal(&a_finish);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void * func_b(void)
{
while(1)
{
pthread_mutex_trylock(&mutex);
pthread_cond_wait(&a_finish,&mutex);
if(count > 0)
{
sleep(1);
printf("count in b=%d\n",count);
printf("B\n");
count--;
pthread_mutex_unlock(&mutex);
}
else
87 {
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&b_finish);
break;
}
pthread_cond_signal(&b_finish);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
void *func_c(void)
{
while(1)
{
pthread_mutex_trylock(&mutex);
pthread_cond_wait(&b_finish,&mutex);
if(count > 0)
{
sleep(1);
printf("count in c=%d\n",count);
printf("c\n");
count--;
pthread_mutex_unlock(&mutex);
}
else
{
pthread_mutex_unlock(&mutex);
break;
}
pthread_cond_signal(&c_finish);
pthread_mutex_unlock(&mutex);
sleep(1);
}
return NULL;
}
int main()
{
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&a_finish,NULL);
pthread_cond_init(&b_finish,NULL);
pthread_cond_init(&c_finish,NULL);
pthread_t a_thread,b_thread,c_thread;
pthread_create(&a_thread,NULL,(void *)func_a,NULL);
pthread_create(&b_thread,NULL,(void *)func_b,NULL);
pthread_create(&c_thread,NULL,(void *)func_c,NULL);
pthread_join(a_thread,NULL);
printf("a exit\n");
pthread_join(b_thread,NULL);
printf("b exit\n");
pthread_join(c_thread,NULL);
printf("c exit\n");
return 0;
}
160,1 底端