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

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

概述原创作品,转载请标明:http://www.voidcn.com/article/p-ntfjuwne-ep.html pthread有很多不同应用,官网都有相应的API解释和Sample,这里不再重复,本文主要介绍一个cocos2d-x多线程同步示例。 1.售票 孙鑫老师的C++和Java多线程售票一直让我念念不忘,好吧,这里用cocos2d-x和pthread实现一个吧。总共有100张火车票

原创作品,转载请标明: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.多线程售票

[cpp] view plain copy //TestLayer.h classCTestLayer: publiccclayer { public: CTestLayer(voID); ~CTestLayer(voID); CREATE_FUNC(CTestLayer); virtualboolinit(); pthread_tsellA_pID,sellB_pID;//线程ID staticinttickets;//票数 staticvoID*threadA(voID*p);//线程A回调 voID*threadB(//线程B回调 }; //TestLayer.cpp #include"TestLayer.h" intCTestLayer::tickets=100;//初始化票数100 CTestLayer::CTestLayer(voID) { } CTestLayer::~CTestLayer(voID) } boolCTestLayer::init() boolbRet=false; do CC_BREAK_IF(!cclayer::init()); pthread_create(&sellA_pID,NulL,threadA,0);//创建线程A pthread_create(&sellB_pID,threadB,0); background-color:inherit">//创建线程B bRet=true; }while(0); returnbRet; voID*CTestLayer::threadA(voID*p) while(true) if(tickets>0) cclog("ASell%d",tickets--);//输出售票,每次减1 else{ break; returnNulL; voID*CTestLayer::threadB(voID*p) true) if(tickets>0) cclog("BSell%d",tickets--); else } 代码很简单,不多说了。我们来看一下输出,会发现有很多不可思议的现象出现,因为每个人每次运行的结果都不一样,所以这里不贴结果了,不可思议的现象可能有:

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

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

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

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

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

copy ASell36 BSell36//卖2次了 ASell35 BSell34 ASell33 BSell32 ASell30//提早卖了 BSell31 BSell28 ASell29 ASell27 BSell26 ASell25 BSell24 ASell23 BSell22 ASell21 BSell20 ASell19 BSell18 ASell17 BSell16 ASell15 BSell14 ASell13 BSell12 ASell11 BSell10 ASell9 BSell8 ASell7 BSell6 ASell5 BSell4 ASell3 BSell2 ASell1 BSell0//站票。。。
3.利用互斥对象同步数据

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

3.1.初始化

在cpp外分配空间:

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

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

copy pthread_mutex_init(&mutex,NulL);
3.2.加锁和解锁

以线程A为例:

copy pthread_mutex_lock(&mutex);//加锁 Sleep(100); pthread_mutex_unlock(&mutex);//解锁 else{ pthread_mutex_unlock(&mutex);//解锁 }
3.3.释放

在当前层的析构函数中:

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

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

copy BSell16 ASell15 BSell14 BSell13 BSell12 BSell11 BSell10 BSell9 BSell8 BSell7 BSell6 BSell5 BSell4 BSell3 BSell2 BSell1
4.源码下载

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

总结

以上是内存溢出为你收集整理的【玩转cocos2d-x之二十二】多线程和同步02-售票全部内容,希望文章能够帮你解决【玩转cocos2d-x之二十二】多线程和同步02-售票所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1065407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存