Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61646
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-10 09:58
个人简介

专业提供linux应用软件开发、oracle数据库底层开发,服务器开发及相关技术支持服务

文章分类

全部博文(24)

文章存档

2015年(24)

我的朋友

分类: LINUX

2015-02-13 08:49:06

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

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<string.h>
  4. #include<semaphore.h>

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


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

  8. void sem_test_init()
  9. {
  10.     int i = 0;
  11.         
  12.         //主线程对应的(创建线程)信号量 初始化为1
  13.     for(i = 0; i < NUM; i++)
  14.     {
  15.         sem_init(&sem_main[i], 0, 1);
  16.     }


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

  21.     }

  22. }

  23. void *thr_fun(void *argv)
  24. {
  25.     int num = (int)argv;
  26.     printf("num=%d\n", num);
  27.     int thr_flag = 1;
  28.     int times = 0;
  29.     int i = 0;


  30.     while(thr_flag)
  31.     {
  32.         sem_wait(&sem_thr[num]);
  33.         for(i = 0; i < 7; i++)
  34.             printf("thr OK\n");
  35.         //sleep(1);
  36.         sem_post(&sem_main[num]);
  37.         times++;
  38.         if(times == 3) //退出无限循环
  39.         {
  40.             //sleep(1);
  41.             //thr_flag = 0;
  42.         }

  43.     }
  44.     usleep(100);

  45. }

  46. int main(int argc, char *argv[])
  47. {
  48.     int irs_flag = 1;
  49.     int main_flag = 0;
  50.     int i = 0;
  51.     pthread_t tid[NUM];
  52.     int j = 0;

  53.     sem_test_init();


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

  59.     //sleep(1);
  60.     while(irs_flag)
  61.     {
  62.         for(i = 0; i < NUM; i++)
  63.         {
  64.             sem_wait(&sem_main[i]);
  65.         }

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

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

  68.         for(i = 0; i < NUM; i++)
  69.         {
  70.             sem_post(&sem_thr[i]);
  71.         }

  72.         main_flag++;
  73.         if(main_flag == 3) //退出无限循环
  74.         {
  75.             //sleep(1);
  76.             //irs_flag = 0;
  77.         }


  78.     }
  79.     usleep(200);
  80.     printf("ININININININ\n");

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

  87.     // printf("OUTOUTOUTOUT\n");

  88.     //销毁相应信号量
  89.     for(i = 0; i < NUM; i++)
  90.     {
  91.         sem_destroy(&sem_main[i]);
  92.         sem_destroy(&sem_thr[i]);
  93.     }

  94.     printf("VVVVVVVVVVVVVV\n");

  95. }

阅读(516) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~