二进制信号量在多线程间实现同步模型
[font=Tahoma, Helvetica, SimSun, sans-serif]在多线程同步开发中,为了实现执行线程在条件未到达时等待条件到达,进而用忙等待实现等待,这样大大浪费了CPU资源且CPU占用很大,导致服务器系统整体性能下降。为了解决CPU占用大的问题,用信号量替代忙等待条件,实现执行线程在条件未到达时用阻塞等待条件到达。下面是用二进制信号量实现多线程间同步简单设计模型。
[font=Tahoma, Helvetica, SimSun, sans-serif]#include
[font=Tahoma, Helvetica, SimSun, sans-serif]#include
[font=Tahoma, Helvetica, SimSun, sans-serif]#include
[font=Tahoma, Helvetica, SimSun, sans-serif]#include
[font=Tahoma, Helvetica, SimSun, sans-serif]#define NUM 8 //---线程创建个数
[font=Tahoma, Helvetica, SimSun, sans-serif]sem_t sem_main[NUM]; //--主线程对应的(创建线程)信号量
[font=Tahoma, Helvetica, SimSun, sans-serif]sem_t sem_thr[NUM];  //--每个创建线程对应的信号量
[font=Tahoma, Helvetica, SimSun, sans-serif]void sem_test_init()
[font=Tahoma, Helvetica, SimSun, sans-serif]{
[font=Tahoma, Helvetica, SimSun, sans-serif]    int i = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]
[font=Tahoma, Helvetica, SimSun, sans-serif]        //主线程对应的(创建线程)信号量 初始化为1
[font=Tahoma, Helvetica, SimSun, sans-serif]    for(i = 0; i < NUM; i++)
[font=Tahoma, Helvetica, SimSun, sans-serif]    {
[font=Tahoma, Helvetica, SimSun, sans-serif]        sem_init(&sem_main[i], 0, 1);
[font=Tahoma, Helvetica, SimSun, sans-serif]    }
[font=Tahoma, Helvetica, SimSun, sans-serif]    //--每个创建线程对应的信号量 初始化为0
[font=Tahoma, Helvetica, SimSun, sans-serif]    for(i = 0; i < NUM; i++)
[font=Tahoma, Helvetica, SimSun, sans-serif]    {
[font=Tahoma, Helvetica, SimSun, sans-serif]        sem_init(&sem_thr[i], 0, 0);
[font=Tahoma, Helvetica, SimSun, sans-serif]    }
[font=Tahoma, Helvetica, SimSun, sans-serif]}
[font=Tahoma, Helvetica, SimSun, sans-serif]void *thr_fun(void *argv)
[font=Tahoma, Helvetica, SimSun, sans-serif]{
[font=Tahoma, Helvetica, SimSun, sans-serif]    int num = (int)argv;
[font=Tahoma, Helvetica, SimSun, sans-serif]    printf("num=%d\n", num);
[font=Tahoma, Helvetica, SimSun, sans-serif]    int thr_flag = 1;
[font=Tahoma, Helvetica, SimSun, sans-serif]    int times = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]    int i = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]    while(thr_flag)
[font=Tahoma, Helvetica, SimSun, sans-serif]    {
[font=Tahoma, Helvetica, SimSun, sans-serif]        sem_wait(&sem_thr[num]); 
[font=Tahoma, Helvetica, SimSun, sans-serif]        for(i = 0; i < 7; i++)
[font=Tahoma, Helvetica, SimSun, sans-serif]            printf("thr OK\n");
[font=Tahoma, Helvetica, SimSun, sans-serif]        //sleep(1);
[font=Tahoma, Helvetica, SimSun, sans-serif]        sem_post(&sem_main[num]);
[font=Tahoma, Helvetica, SimSun, sans-serif]        times++;
[font=Tahoma, Helvetica, SimSun, sans-serif]        if(times == 3)  //退出无限循环
[font=Tahoma, Helvetica, SimSun, sans-serif]        {
[font=Tahoma, Helvetica, SimSun, sans-serif]            //sleep(1);
[font=Tahoma, Helvetica, SimSun, sans-serif]            //thr_flag = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]        }
[font=Tahoma, Helvetica, SimSun, sans-serif]    }
[font=Tahoma, Helvetica, SimSun, sans-serif]    usleep(100);
[font=Tahoma, Helvetica, SimSun, sans-serif]}
[font=Tahoma, Helvetica, SimSun, sans-serif]int main(int argc, char *argv[])
[font=Tahoma, Helvetica, SimSun, sans-serif]{
[font=Tahoma, Helvetica, SimSun, sans-serif]    int irs_flag = 1;
[font=Tahoma, Helvetica, SimSun, sans-serif]    int main_flag = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]    int i = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]    pthread_t  tid[NUM];
[font=Tahoma, Helvetica, SimSun, sans-serif]    int j = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]    sem_test_init();
[font=Tahoma, Helvetica, SimSun, sans-serif]    for(j = 0; j < NUM; j++)
[font=Tahoma, Helvetica, SimSun, sans-serif]    {
[font=Tahoma, Helvetica, SimSun, sans-serif]        pthread_create(&tid[j], NULL, thr_fun, (void *)j);
[font=Tahoma, Helvetica, SimSun, sans-serif]        printf("***************j=%d\n", j);
[font=Tahoma, Helvetica, SimSun, sans-serif]    }
[font=Tahoma, Helvetica, SimSun, sans-serif]    //sleep(1);
[font=Tahoma, Helvetica, SimSun, sans-serif]    while(irs_flag)
[font=Tahoma, Helvetica, SimSun, sans-serif]    {
[font=Tahoma, Helvetica, SimSun, sans-serif]        for(i = 0; i < NUM; i++)
[font=Tahoma, Helvetica, SimSun, sans-serif]        {
[font=Tahoma, Helvetica, SimSun, sans-serif]            sem_wait(&sem_main[i]);
[font=Tahoma, Helvetica, SimSun, sans-serif]        }
[font=Tahoma, Helvetica, SimSun, sans-serif]        printf("sem_main %d times sem_wait OK\n", main_flag);
[font=Tahoma, Helvetica, SimSun, sans-serif]        printf("sem_thr %d times sem_post start\n", main_flag);
[font=Tahoma, Helvetica, SimSun, sans-serif]        for(i = 0; i < NUM; i++)
[font=Tahoma, Helvetica, SimSun, sans-serif]        {
[font=Tahoma, Helvetica, SimSun, sans-serif]            sem_post(&sem_thr[i]);
[font=Tahoma, Helvetica, SimSun, sans-serif]        }
[font=Tahoma, Helvetica, SimSun, sans-serif]        main_flag++;
[font=Tahoma, Helvetica, SimSun, sans-serif]        if(main_flag == 3) //退出无限循环
[font=Tahoma, Helvetica, SimSun, sans-serif]        {
[font=Tahoma, Helvetica, SimSun, sans-serif]            //sleep(1);
[font=Tahoma, Helvetica, SimSun, sans-serif]            //irs_flag = 0;
[font=Tahoma, Helvetica, SimSun, sans-serif]        }
[font=Tahoma, Helvetica, SimSun, sans-serif]    }
[font=Tahoma, Helvetica, SimSun, sans-serif]    usleep(200);
[font=Tahoma, Helvetica, SimSun, sans-serif]    printf("ININININININ\n");
[font=Tahoma, Helvetica, SimSun, sans-serif]        //等待线程退出
[font=Tahoma, Helvetica, SimSun, sans-serif]    for(i = 0; i < NUM; i++)
[font=Tahoma, Helvetica, SimSun, sans-serif]    {
[font=Tahoma, Helvetica, SimSun, sans-serif]        pthread_join(tid[i], NULL);
[font=Tahoma, Helvetica, SimSun, sans-serif]        printf("OUTOUTOUTOUT\n");
[font=Tahoma, Helvetica, SimSun, sans-serif]    }
[font=Tahoma, Helvetica, SimSun, sans-serif]    // printf("OUTOUTOUTOUT\n");
[font=Tahoma, Helvetica, SimSun, sans-serif]    //销毁相应信号量
[font=Tahoma, Helvetica, SimSun, sans-serif]    for(i = 0; i < NUM; i++)
[font=Tahoma, Helvetica, SimSun, sans-serif]    {
[font=Tahoma, Helvetica, SimSun, sans-serif]        sem_destroy(&sem_main[i]);
[font=Tahoma, Helvetica, SimSun, sans-serif]        sem_destroy(&sem_thr[i]);
[font=Tahoma, Helvetica, SimSun, sans-serif]    }
[font=Tahoma, Helvetica, SimSun, sans-serif]    printf("VVVVVVVVVVVVVV\n");
[font=Tahoma, Helvetica, SimSun, sans-serif]}