标签:中比 分享 技术 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