标签:中比 分享 技术 nts 一个人 rac name bre break
本篇接上篇继续讲:上篇传送门:http://blog.csdn.net/star530/article/details/24186783
简单的东西我都说的几乎相同了,想挖点深的差点把自己给填进去。
以下实际演练一下。请同意我參考偶尔E往事的一篇线程的博客, 他用的是pThread。这里我就用std::thread。
1.售票
孙鑫老师的C++和Java多线程售票也一直让我念念不忘(好吧,我承认我没看过)。这里用cocos2d-x3.0和C++11的std::thread实现一个吧。总共同拥有100张诺亚方舟船票。有2个售票点A和B在售票(一张票就一百亿美元吧)。当票卖完了就结束了。我们知道当程序一開始进程就会创建一个主线程,所以能够在主线程基础上再创建2个线程A和B,再线程A和B中分别售票,当票数为0的时候,结束线程A和B。
2.多线程售票,代码例如以下:
//HelloWorld.h class HelloWorld : public cocos2d::Layer { public: static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(HelloWorld); void myThreadA();//线程A void myThreadB();//线程B int tickets;//票数 }; //.cpp bool HelloWorld::init() { if ( !Layer::init() ) { return false; } tickets = 100;//100张票 std::thread tA(&HelloWorld::myThreadA,this);//创建一个分支线程,回调到myThread函数里 std::thread tB(&HelloWorld::myThreadB,this); tA.detach(); tB.detach(); // t1.detach(); CCLOG("in major thread");//在主线程 return true; } void HelloWorld::myThreadA() { while(true) { if(tickets>0) { Sleep(10); CCLOG("A Sell %d",tickets--);//输出售票。每次减1 } else { break; } } } void HelloWorld::myThreadB() { while(true) { if (tickets>0) { Sleep(10); CCLOG("B Sell %d",tickets--); } else { break; } } }
假设你认为不会有这么巧,那么在打印结果前加上这么一句:
Sleep(100);执行结果如图所看到的:
3.利用相互排斥对象同步数据
这个问题主要是由于一个线程执行到一半的时候,时间片的切换导致还有一个线程改动了同一个数据,当再次切换会原来线程并继续往下执行的时候,数据由于被改动了导致结果出错。
所以我们要做的就是保证这个线程全然执行完。所以对线程加锁是个不错的注意,相互排斥对象mutex就是这个锁。
3.1、初始化相互排斥锁
std::mutex mutex;//线程相互排斥对象3.2、改动myThreadA与myThreadB的代码,在里面加入相互排斥锁
void HelloWorld::myThreadA() { while(true) { mutex.lock();//加锁 if(tickets>0) { Sleep(10); CCLOG("A Sell %d",tickets--);//输出售票。每次减1 mutex.unlock();//解锁 } else { mutex.unlock(); break; } } } void HelloWorld::myThreadB() { while(true) { mutex.lock(); if (tickets>0) { Sleep(10); CCLOG("B Sell %d",tickets--); mutex.unlock(); } else { mutex.unlock(); break; } } }执行结果例如以下。完美
嘿嘿嘿嘿。
尊重原创,转载请注明来源:http://blog.csdn.net/star530/article/details/24187103
Cocos2dx 3.0 过渡篇(二十七)C++11多线程std::thread的简单使用(下)
标签:中比 分享 技术 nts 一个人 rac name bre break
原文地址:http://www.cnblogs.com/cynchanpin/p/7354223.html