编写一个程序,开启3个 线程,这3个线程的ID分别为ABC,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示,如ABCABC……依次递推;
提示:A只能叫醒B,B只能唤醒C,C只能唤醒A;
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
sem_t sema,semb,semc;
void* callBackA(void* arg)
{
pthread_detach(pthread_self());
while(1)
{
sem_wait(&sema);
printf("A\n");
sleep(1);
sem_post(&semb);
}
pthread_exit(NULL);
}
void* callBackB(void* arg)
{
pthread_detach(pthread_self());
while(1)
{
sem_wait(&semb);
printf("B\n");
sleep(1);
sem_post(&semc);
}
pthread_exit(NULL);
}
void* callBackC(void* arg)
{
pthread_detach(pthread_self());
while(1)
{
sem_wait(&semc);
printf("C\n");
sleep(1);
sem_post(&sema);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
sem_init(&sema,0,1);
sem_init(&semb,0,0);
sem_init(&semb,0,0);
//创建A进程
pthread_t tida;
if(pthread_create(&tida,NULL,callBackA,NULL) != 0)
{
perror("pthread_create");
return -1;
}
//创建B进程
pthread_t tidb;
if(pthread_create(&tidb,NULL,callBackB,NULL) != 0)
{
perror("pthread_create");
return -1;
}
//创建C进程
pthread_t tidc;
if(pthread_create(&tida,NULL,callBackC,NULL) != 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tida,NULL);
pthread_join(tidb,NULL);
pthread_join(tidc,NULL);
return 0;
}