二进制信号量在多线程间实现同步模型

在多线程同步开发中,为了实现执行线程在条件未到达时等待条件到达,进而用忙等待实现等待,这样大大浪费了CPU资源且CPU占用很大,导致服务器系统整体性能下降。为了解决CPU占用大的问题,用信号量替代忙等待条件,实现执行线程在条件未到达时用阻塞等待条件到达。下面是用二进制信号量实现多线程间同步简单设计模型。
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<semaphore.h>

#define NUM  8 //---线程创建个数


sem_t sem_main[NUM]; //--主线程对应的(创建线程)信号量
sem_t sem_thr[NUM];  //--每个创建线程对应的信号量

void sem_test_init()
{
    int i = 0;
        
        //主线程对应的(创建线程)信号量 初始化为1
    for(i = 0; i < NUM; i++)
    {
        sem_init(&sem_main[i], 0, 1);
    }


    //--每个创建线程对应的信号量 初始化为0
    for(i = 0; i < NUM; i++)
    {
        sem_init(&sem_thr[i], 0, 0);

    }

}

void *thr_fun(void *argv)
{
    int num = (int)argv;
    printf("num=%d\n", num);
    int thr_flag = 1;
    int times = 0;
    int i = 0;


    while(thr_flag)
    {
        sem_wait(&sem_thr[num]); 
        for(i = 0; i < 7; i++)
            printf("thr OK\n");
        //sleep(1);
        sem_post(&sem_main[num]);
        times++;
        if(times == 3)  //退出无限循环
        {
            //sleep(1);
            //thr_flag = 0;
        }

    }
    usleep(100);

}

int main(int argc, char *argv[])
{
    int irs_flag = 1;
    int main_flag = 0;
    int i = 0;
    pthread_t  tid[NUM];
    int j = 0;

    sem_test_init();


    for(j = 0; j < NUM; j++)
    {
        pthread_create(&tid[j], NULL, thr_fun, (void *)j);
        printf("***************j=%d\n", j);
    }

    //sleep(1);
    while(irs_flag)
    {
        for(i = 0; i < NUM; i++)
        {
            sem_wait(&sem_main[i]);
        }

        printf("sem_main %d times sem_wait OK\n", main_flag);

        printf("sem_thr %d times sem_post start\n", main_flag);

        for(i = 0; i < NUM; i++)
        {
            sem_post(&sem_thr[i]);
        }

        main_flag++;
        if(main_flag == 3) //退出无限循环
        {
            //sleep(1);
            //irs_flag = 0;
        }


    }
    usleep(200);
    printf("ININININININ\n");

        //等待线程退出
    for(i = 0; i < NUM; i++)
    {
        pthread_join(tid[i], NULL);
        printf("OUTOUTOUTOUT\n");
    }

    // printf("OUTOUTOUTOUT\n");

    //销毁相应信号量
    for(i = 0; i < NUM; i++)
    {
        sem_destroy(&sem_main[i]);
        sem_destroy(&sem_thr[i]);
    }

    printf("VVVVVVVVVVVVVV\n");

}

转载于:https://my.oschina.net/u/1865121/blog/359536

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值