#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
pthread_t id[4];
sem_t sem[4];
void *print_a(void *arg)
{
while(1)
{
sem_wait(&sem[0]);
printf("A");
fflush(stdout);
sleep(1);
sem_post(&sem[1]);
}
}
void *print_b(void *arg)
{
while(1)
{
sem_wait(&sem[1]);
printf("B");
fflush(stdout);
sleep(1);
sem_post(&sem[2]);
}
}
void *print_c(void *arg)
{
while(1)
{
sem_wait(&sem[2]);
printf("C");
fflush(stdout);fflush(stdout);
sleep(1);
sem_post(&sem[3]);
}
}
void *print_d(void *arg)
{
while(1)
{
sem_wait(&sem[3]);
printf("D");
fflush(stdout);
sleep(1);
sem_post(&sem[0]);
}
}
void InitSem()
{
for(int i = 0;i < 4;i++)
{
if(i == 0)
{
sem_init(&sem[i],0,1);
}
else
{
sem_init(&sem[i],0,0);
}
}
}
void my_exit(int sig)
{
for(int i = 0;i < 4;i++)
{
sem_destroy(&sem[i]);
pthread_cancel(id[i]);
}
printf("程序已正常退出\n");
}
int main()
{
signal(SIGINT,my_exit);//注册信号处理函数
InitSem();//初始化信号量
void *(*func[4])(void *) = {print_a,print_b,print_c,print_d};//简写,由于四个线程内容一样可以用一个函数指针数组来存放
int ret;//定义一个整型变量来判断线程是否创建成功
for(int i = 0;i < 4;i++)
{
ret = pthread_create(&id[i],NULL,func[i],NULL);
if(ret < 0)
{
printf("pthread_create error\n");
exit(1);
}
pthread_detach(id[i]);
}
pause();//进程挂起
}
C程序:多线程按顺序打印ABCD
最新推荐文章于 2024-01-15 15:27:39 发布