题:编写一个程序,开启3个 线程,这3个线程的ID分别为ABC,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示,如ABCABC……依次递推;
使用信号量解决该问题。
代码如:
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
sem_t sem1,sem2,sem3; //定义全局变量(信号量)
void *callback1(void *arg) //进程1,打印A
{
int i=0;
while(1)
{
if(10 == i)
{
pthread_exit(NULL);
}
sem_wait(&sem1);
printf("A");
sem_post(&sem2);
i++;
}
}
void *callback2(void *arg) //进程2,打印B
{
int i=0;
while(1)
{
if(10 == i)
{
pthread_exit(NULL);
}
sem_wait(&sem2);
printf("B");
sem_post(&sem3);
i++;
}
}
void *callback3(void *arg) //进程3,打印B
{
int i=0;
while(1)
{
if(10 == i)
{
pthread_exit(NULL);
}
sem_wait(&sem3);
printf("c");
sem_post(&sem1);
i++;
}
}
int main(int argc, const char *argv[])
{
//创建信号量
if(sem_init(&sem1,0,1) < 0)
{
perror("sem_init");
return -1;
}
if(sem_init(&sem2,0,0) < 0) //初始值为0,目的是让进程1先运行
{
perror("sem_init");
return -1;
}
if(sem_init(&sem3,0,0) < 0) //初始值为0,目的是让进程2先运行
{
perror("sem_init");
return -1;
}
printf("sem_init successs\n");
pthread_t tid1,tid2,tid3; //创建三个进程
if(pthread_create(&tid1,NULL,callback1,NULL) != 0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,callback2,NULL) != 0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid3,NULL,callback3,NULL) != 0)
{
perror("pthread_create");
return -1;
}
printf("thread create successs\n");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL); //回收线程资源
sem_destroy(&sem1);
sem_destroy(&sem2); //销毁信号量
sem_destroy(&sem3);
return 0;
}
程序运行效果: