C程序:多线程按顺序打印ABCD

#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();//进程挂起
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值