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