编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
代码如下
/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name锛?Author锛欽erey_Jobs Version:0.1 Date:
Description锛?Funcion List:
*****************************************************/
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<pthread.h>
#include<unistd.h>
#define N 10
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condA_B = PTHREAD_COND_INITIALIZER;
pthread_cond_t condB_C = PTHREAD_COND_INITIALIZER;
pthread_cond_t condC_A = PTHREAD_COND_INITIALIZER;
int flagA,flagB,flagC;
void *funa(void *arg)
{
int i = 0;
//printf("*********\n");
while(i < N)
{
pthread_mutex_lock(&mutex);
flagA = 1;
// printf("**********\n");
pthread_cond_wait(&condC_A,&mutex);
flagA = 0;
// printf("*************\n");
printf("A-->%d-->%lu\n",i,pthread_self());
while(!flagB)
{
pthread_mutex_unlock(&mutex);
sleep(1);
pthread_mutex_lock(&mutex);
}
pthread_cond_broadcast(&condA_B);
pthread_mutex_unlock(&mutex);
i++;
sleep(1);
}
flagA = 1;
}
void *funb(void *arg)
{
int i = 0;
while(i < N)
{
pthread_mutex_lock(&mutex);
flagB = 1;
pthread_cond_wait(&condA_B,&mutex);
flagB = 0;
printf("B-->%d-->%lu\n",i,pthread_self());
while(!flagC)
{
pthread_mutex_unlock(&mutex);
sleep(1);
pthread_mutex_lock(&mutex);
}
pthread_cond_broadcast(&condB_C);
pthread_mutex_unlock(&mutex);
i++;
sleep(1);
}
}
void *func(void *arg)
{
int i = 0;
while(i < N)
{
pthread_mutex_lock(&mutex);
flagC = 1;
pthread_cond_wait(&condB_C,&mutex);
flagC = 0;
printf("C-->%d-->%lu\n",i,pthread_self());
while(!flagA)
{
pthread_mutex_unlock(&mutex);
sleep(1);
pthread_mutex_lock(&mutex);
}
pthread_cond_broadcast(&condC_A);
pthread_mutex_unlock(&mutex);
i++;
sleep(1);
}
}
int main()
{
pthread_t pr1,pr2,pr3;
if(pthread_create(&pr1,NULL,funa,NULL) != 0)
{
printf("create pr1 error!\n");
exit(1);
}
if(pthread_create(&pr2,NULL,funb,NULL) != 0)
{
printf("create pr2 error!\n");
exit(1);
}
if(pthread_create(&pr3,NULL,func,NULL) != 0)
{
printf("creat2 pr3 error!\n");
exit(1);
}
//printf("***************10\n");
pthread_mutex_lock(&mutex);
while(!flagC)
{
pthread_mutex_unlock(&mutex);
sleep(1);
pthread_mutex_lock(&mutex);
}
printf("hi\n");
pthread_cond_broadcast(&condC_A);
pthread_mutex_unlock(&mutex);
pthread_join(pr1,NULL);
printf("finish pr1!\n");
pthread_join(pr2,NULL);
printf("finish pr2!\n");
pthread_join(pr3,NULL);
printf("finish pr3!\n");
return 0;
}