【玩转cocos2d-x之二十二】多线程和同步02-售票

前端之家收集整理的这篇文章主要介绍了【玩转cocos2d-x之二十二】多线程和同步02-售票前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原创作品,转载请标明http://www.jb51.cc/article/p-ntfjuwne-ep.html


pthread有很多不同应用,官网都有相应的API解释和Sample,这里不再重复,本文主要介绍一个cocos2d-x多线程和同步示例。


1.售票

孙鑫老师的C++和Java多线程售票一直让我念念不忘,好吧,这里用cocos2d-x和pthread实现一个吧。总共有100张火车票,有2个售票点A和B再售票,当票卖完了就结束了。我们知道当程序一开始进程就会创建一个主线程,所以可以在主线程基础上再创建2个线程A和B,再线程A和B中分别售票,当票数为0的时候,结束线程A和B。


2.多线程售票

  1. //TestLayer.h@H_403_61@
  2. classCTestLayer:@H_403_61@
  3. publicCCLayer@H_403_61@
  4. {@H_403_61@
  5. public:@H_403_61@
  6. CTestLayer(void);@H_403_61@
  7. ~CTestLayer(void);@H_403_61@
  8. @H_403_61@
  9. CREATE_FUNC(CTestLayer);@H_403_61@
  10. virtualboolinit();@H_403_61@
  11. @H_403_61@
  12. pthread_tsellA_pid,sellB_pid;//线程id@H_403_61@
  13. staticinttickets;//票数@H_403_61@
  14. staticvoid*threadA(void*p);//线程A回调@H_403_61@
  15. void*threadB(//线程B回调@H_403_61@
  16. };@H_403_61@
  17. //TestLayer.cpp@H_403_61@
  18. #include"TestLayer.h"@H_403_61@
  19. intCTestLayer::tickets=100;//初始化票数100@H_403_61@
  20. CTestLayer::CTestLayer(void)@H_403_61@
  21. {@H_403_61@
  22. }@H_403_61@
  23. CTestLayer::~CTestLayer(void)@H_403_61@
  24. }@H_403_61@
  25. boolCTestLayer::init()@H_403_61@
  26. boolbRet=false;@H_403_61@
  27. do@H_403_61@
  28. CC_BREAK_IF(!CCLayer::init());@H_403_61@
  29. pthread_create(&sellA_pid,NULL,threadA,0);//创建线程A@H_403_61@
  30. pthread_create(&sellB_pid,threadB,0); background-color:inherit">//创建线程B@H_403_61@
  31. bRet=true;@H_403_61@
  32. }while(0);@H_403_61@
  33. returnbRet;@H_403_61@
  34. void*CTestLayer::threadA(void*p)@H_403_61@
  35. while(true)@H_403_61@
  36. if(tickets>0)@H_403_61@
  37. CCLog("ASell%d",tickets--);//输出售票,每次减1@H_403_61@
  38. else{@H_403_61@
  39. break;@H_403_61@
  40. returnNULL;@H_403_61@
  41. void*CTestLayer::threadB(void*p)@H_403_61@
  42. true)@H_403_61@
  43. if(tickets>0)@H_403_61@
  44. CCLog("BSell%d",tickets--);@H_403_61@
  45. else@H_403_61@
  46. }@H_403_61@
代码很简单,不多说了。我们来看一下输出,会发现有很多不可思议的现象出现,因为每个人每次运行的结果都不一样,所以这里不贴结果了,不可思议的现象可能有:

(1)同一张票卖了2次。

(2)后面的票比前面的票先卖出去。

(3)第0张票竟然也可以卖。(这算站票么。。。)

原因不多解释了,时间片的问题,不明白的Google之。如果你觉得不会有这么巧,那么在打印结果前加上这么一句:

copy
    Sleep(100);@H_403_61@
人为干扰线程的运行,增大出错几率。结果可能会是这样:

copy
    ASell36@H_403_61@
  1. BSell36//卖2次了@H_403_61@
  2. ASell35@H_403_61@
  3. BSell34@H_403_61@
  4. ASell33@H_403_61@
  5. BSell32@H_403_61@
  6. ASell30//提早卖了@H_403_61@
  7. BSell31@H_403_61@
  8. BSell28@H_403_61@
  9. ASell29@H_403_61@
  10. ASell27@H_403_61@
  11. BSell26@H_403_61@
  12. ASell25@H_403_61@
  13. BSell24@H_403_61@
  14. ASell23@H_403_61@
  15. BSell22@H_403_61@
  16. ASell21@H_403_61@
  17. BSell20@H_403_61@
  18. ASell19@H_403_61@
  19. BSell18@H_403_61@
  20. ASell17@H_403_61@
  21. BSell16@H_403_61@
  22. ASell15@H_403_61@
  23. BSell14@H_403_61@
  24. ASell13@H_403_61@
  25. BSell12@H_403_61@
  26. ASell11@H_403_61@
  27. BSell10@H_403_61@
  28. ASell9@H_403_61@
  29. BSell8@H_403_61@
  30. ASell7@H_403_61@
  31. BSell6@H_403_61@
  32. ASell5@H_403_61@
  33. BSell4@H_403_61@
  34. ASell3@H_403_61@
  35. BSell2@H_403_61@
  36. ASell1@H_403_61@
  37. BSell0//站票。。。@H_403_61@

3.利用互斥对象同步数据

这个问题主要是因为一个线程执行到一半的时候,时间片的切换导致另一个线程修改了同一个数据,当再次切换会原来线程并继续往下运行的时候,数据由于被修改了导致结果出错。所以我们要做的就是保证这个线程完全执行完,所以对线程加锁是个不错的注意,互斥对象mutex就是这个锁。

3.1.初始化

在cpp外分配空间:

copy
    pthread_mutex_tCTestLayer::mutex;//mutex是静态成员变量@H_403_61@

在init中初始化,动态初始化:

copy
    pthread_mutex_init(&mutex,NULL);@H_403_61@

3.2.加锁和解锁

以线程A为例:

copy
    pthread_mutex_lock(&mutex);//加锁@H_403_61@
  1. Sleep(100);@H_403_61@
  2. 403_61@
  3. pthread_mutex_unlock(&mutex);//解锁@H_403_61@
  4. else{@H_403_61@
  5. pthread_mutex_unlock(&mutex);//解锁@H_403_61@
  6. }@H_403_61@

3.3.释放

在当前层的析构函数中:

copy
    pthread_mutex_destroy(&mutex);//前提要保证是解锁状态,否则会返回16的错误,释放失败@H_403_61@

这个时候再看一下结果,Bingo!

copy
    BSell16@H_403_61@
  1. ASell15@H_403_61@
  2. BSell14@H_403_61@
  3. BSell13@H_403_61@
  4. BSell12@H_403_61@
  5. BSell11@H_403_61@
  6. BSell10@H_403_61@
  7. BSell9@H_403_61@
  8. BSell8@H_403_61@
  9. BSell7@H_403_61@
  10. BSell6@H_403_61@
  11. BSell5@H_403_61@
  12. BSell4@H_403_61@
  13. BSell3@H_403_61@
  14. BSell2@H_403_61@
  15. BSell1@H_403_61@

4.源码下载

http://download.csdn.net/detail/jackyvincefu/6503759

猜你在找的Cocos2d-x相关文章