Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1774452
  • 博文数量: 198
  • 博客积分: 4088
  • 博客等级: 上校
  • 技术积分: 2391
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 16:29
个人简介

游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c

文章分类

全部博文(198)

文章存档

2017年(1)

2016年(12)

2015年(1)

2014年(3)

2013年(13)

2012年(18)

2011年(150)

分类: LINUX

2011-08-26 09:45:31

根据信号量的原理,自己写了一个简单的信号量类,用于线程同步,以下代码在Linux下调试通过
  1. #include<iostream>
  2. #include<stdlib.h>
  3. #include<pthread.h>

  4. using namespace std;

  5. class Sem
  6. {
  7.       public:
  8.               Sem(int &initValue){ semValue = initValue;}
  9.               void WaitSem()
  10.               {
  11.                        //信号量大于0,将信号量减1
  12.                       if(semValue > 0)
  13.                       {
  14.                                   semValue--;
  15.                       }
  16.                       else
  17.                       {    
  18.                            //信号量 <= 0,则阻塞线程,直到信号量大于0
  19.                           while(1)
  20.                           {
  21.                               if(semValue > 0)
  22.                               {
  23.                                   semValue--;
  24.                                   break;
  25.                               }
  26.                               else
  27.                                   continue;
  28.                           }
  29.                      }
  30.              }
  31.               void PostSem()
  32.               {         //信号量加1
  33.                       semValue++;
  34.                 }
  35.       private:
  36.               int semValue;
  37. };

  38. int semp =0; //信号量初始值
  39. Sem sem(semp);
  40. int ncount = 0;
  41. int threadnum = 0;
  42. void *count1(void* arg)
  43. {
  44.       sem.WaitSem();
  45.       threadnum++;
  46.       char name[20];
  47.       sprintf(name, "thread %d", threadnum);
  48.       cout << name << " start!" << endl;
  49.       for(int i = 0; i < 5; i++)
  50.       {
  51.               ncount += 3;
  52.      }
  53.      sleep(1);
  54.      cout << name << " ncount: " << ncount << endl;
  55.      sem.PostSem();
  56.     
  57.      return (void*)0;
  58. }

  59. int main()
  60. {
  61.      pthread_t tid[10];
  62.      cout << "start create thread!" << endl;
  63.      
  64.      sem.PostSem();
  65.      
  66.      
  67.      for(int i = 0; i < 10; i++)
  68.      {
  69.         pthread_create(&tid[i], NULL, count1, NULL);
  70.     }
  71.     
  72.     for(int i = 0; i < 10; i++)
  73.     {
  74.      pthread_join(tid[i], NULL);
  75.     }
  76.     
  77.     sleep(2);
  78.     
  79.     cout << "main thread" << endl;
  80.     
  81.     return 0;
  82. }

 

程序的运行结果如下

start create thread!
thread 1 start!
thread 1 ncount: 15
thread 2 start!
thread 2 ncount: 30
thread 3 start!
thread 3 ncount: 45
thread 4 start!
thread 4 ncount: 60
thread 5 start!
thread 5 ncount: 75
thread 6 start!
thread 6 ncount: 90
thread 7 start!
thread 7 ncount: 105
thread 8 start!
thread 8 ncount: 120
thread 9 start!
thread 9 ncount: 135
thread 10 start!
thread 10 ncount: 150
main thread

在一个线程对ncount进行操作的时候,其他线程被阻塞,因此打印出来的ncount依次累加15.

注释掉 sem.WaitSem()和sem.PostSem()之后,程序运行结果如下

start create thread!
thread 1 start!
thread 2 start!
thread 3 start!
thread 4 start!
thread 5 start!
thread 6 start!
thread 7 start!
thread 8 start!
thread 9 start!
thread 10 start!
thread 1 ncount: 150
thread 2 ncount: 150
thread 3 ncount: 150
thread 4 ncount: 150
thread 5 ncount: 150
thread 6 ncount: 150
thread 7 ncount: 150
thread 8 ncount: 150
thread 9 ncount: 150
thread 10 ncount: 150
main thread

因为在1秒钟里,10个线程都对ncount加了15,因此大于出来的ncount为150

此信号量类实现了简单的线程同步

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