【玩转cocos2d-x之二十二】多线程和同步02-售票
2013-11-05 10:15
323 查看
[b]原创作品,转载请标明:[/b]http://blog.csdn.net/jackystudio/article/details/14161151
pthread有很多不同应用,官网都有相应的API解释和Sample,这里不再重复,本文主要介绍一个cocos2d-x多线程和同步示例。
(1)同一张票卖了2次。
(2)后面的票比前面的票先卖出去。
(3)第0张票竟然也可以卖。(这算站票么。。。)
原因不多解释了,时间片的问题,不明白的Google之。如果你觉得不会有这么巧,那么在打印结果前加上这么一句:
在init中初始化,动态初始化:
这个时候再看一下结果,Bingo!
pthread有很多不同应用,官网都有相应的API解释和Sample,这里不再重复,本文主要介绍一个cocos2d-x多线程和同步示例。
1.售票
孙鑫老师的C++和Java多线程售票一直让我念念不忘,好吧,这里用cocos2d-x和pthread实现一个吧。总共有100张火车票,有2个售票点A和B再售票,当票卖完了就结束了。我们知道当程序一开始进程就会创建一个主线程,所以可以在主线程基础上再创建2个线程A和B,再线程A和B中分别售票,当票数为0的时候,结束线程A和B。2.多线程售票
//TestLayer.h class CTestLayer : public CCLayer { public: CTestLayer(void); ~CTestLayer(void); CREATE_FUNC(CTestLayer); virtual bool init(); pthread_t sellA_pid,sellB_pid;//线程id static int tickets;//票数 static void* threadA(void* p);//线程A回调 static void* threadB(void* p);//线程B回调 }; //TestLayer.cpp #include "TestLayer.h" int CTestLayer::tickets=100;//初始化票数100 CTestLayer::CTestLayer(void) { } CTestLayer::~CTestLayer(void) { } bool CTestLayer::init() { bool bRet=false; do { CC_BREAK_IF(!CCLayer::init()); pthread_create(&sellA_pid,NULL,threadA,0);//创建线程A pthread_create(&sellB_pid,NULL,threadB,0);//创建线程B bRet=true; } while (0); return bRet; } void* CTestLayer::threadA(void* p) { while(true) { if(tickets>0) { CCLog("A Sell %d",tickets--);//输出售票,每次减1 } else { break; } } return NULL; } void* CTestLayer::threadB(void* p) { while(true) { if (tickets>0) { CCLog("B Sell %d",tickets--); } else { break; } } return NULL; }代码很简单,不多说了。我们来看一下输出,会发现有很多不可思议的现象出现,因为每个人每次运行的结果都不一样,所以这里不贴结果了,不可思议的现象可能有:
(1)同一张票卖了2次。
(2)后面的票比前面的票先卖出去。
(3)第0张票竟然也可以卖。(这算站票么。。。)
原因不多解释了,时间片的问题,不明白的Google之。如果你觉得不会有这么巧,那么在打印结果前加上这么一句:
Sleep(100);人为干扰线程的运行,增大出错几率。结果可能会是这样:
A Sell 36 B Sell 36//卖2次了 A Sell 35 B Sell 34 A Sell 33 B Sell 32 A Sell 30//提早卖了 B Sell 31 B Sell 28 A Sell 29 A Sell 27 B Sell 26 A Sell 25 B Sell 24 A Sell 23 B Sell 22 A Sell 21 B Sell 20 A Sell 19 B Sell 18 A Sell 17 B Sell 16 A Sell 15 B Sell 14 A Sell 13 B Sell 12 A Sell 11 B Sell 10 A Sell 9 B Sell 8 A Sell 7 B Sell 6 A Sell 5 B Sell 4 A Sell 3 B Sell 2 A Sell 1 B Sell 0//站票。。。
3.利用互斥对象同步数据
这个问题主要是因为一个线程执行到一半的时候,时间片的切换导致另一个线程修改了同一个数据,当再次切换会原来线程并继续往下运行的时候,数据由于被修改了导致结果出错。所以我们要做的就是保证这个线程完全执行完,所以对线程加锁是个不错的注意,互斥对象mutex就是这个锁。3.1.初始化
在cpp外分配空间:pthread_mutex_t CTestLayer::mutex;//mutex是静态成员变量
在init中初始化,动态初始化:
pthread_mutex_init(&mutex,NULL);
3.2.加锁和解锁
以线程A为例:void* CTestLayer::threadA(void* p) { while(true) { pthread_mutex_lock(&mutex);//加锁 if(tickets>0) { Sleep(100); CCLog("A Sell %d",tickets--); pthread_mutex_unlock(&mutex);//解锁 } else { pthread_mutex_unlock(&mutex);//解锁 break; } } return NULL; }
3.3.释放
在当前层的析构函数中:pthread_mutex_destroy(&mutex);//前提要保证是解锁状态,否则会返回16的错误,释放失败
这个时候再看一下结果,Bingo!
B Sell 16 A Sell 15 B Sell 14 B Sell 13 B Sell 12 B Sell 11 B Sell 10 B Sell 9 B Sell 8 B Sell 7 B Sell 6 B Sell 5 B Sell 4 B Sell 3 B Sell 2 B Sell 1
4.源码下载
http://download.csdn.net/detail/jackyvincefu/6503759相关文章推荐
- 【玩转cocos2d-x之二十二】多线程和同步02-售票
- 【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载
- 【转】【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载
- 【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载
- 【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载
- 【玩转cocos2d-x之二十一】多线程和同步01-pthread库
- 【玩转cocos2d-x之二十三】多线程和同步03-图片异步加载
- 【玩转cocos2d-x之二十一】多线程和同步01-pthread库
- C# 多线程 简单的同步售票系统代码
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- java多线程实现火车售票系统 以及java中的同步的实现 同步块 和同步方法同时 同步
- JAVA_多线程_用实现的方式实现售多窗口售票并用同步方法的方式保证线程安全
- 通过多线程的同步于互斥,模拟售票
- Java 多线程售票案例(同步锁)
- 多线程售票同步代码段(二)
- 02_多线程之售票
- 黑马程序员-Java 多线程(二)-线程的同步、死锁、Lock接口
- 【玩转cocos2d-x之一】V2.2.0版本开发环境配置
- java多线程 -- 同步鎖
- 多线程中未对集合进行同步操作引发空引用异常