原创作品,转载请标明: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@H_403_61@
- classCTestLayer:@H_403_61@
- publicCCLayer@H_403_61@
- {@H_403_61@
- public:@H_403_61@
- CTestLayer(void);@H_403_61@
- ~CTestLayer(void);@H_403_61@
- @H_403_61@
- CREATE_FUNC(CTestLayer);@H_403_61@
- virtualboolinit();@H_403_61@
- @H_403_61@
- pthread_tsellA_pid,sellB_pid;//线程id@H_403_61@
- staticinttickets;//票数@H_403_61@
- staticvoid*threadA(void*p);//线程A回调@H_403_61@
- void*threadB(//线程B回调@H_403_61@
- };@H_403_61@
- //TestLayer.cpp@H_403_61@
- #include"TestLayer.h"@H_403_61@
- intCTestLayer::tickets=100;//初始化票数100@H_403_61@
- CTestLayer::CTestLayer(void)@H_403_61@
- {@H_403_61@
- }@H_403_61@
- CTestLayer::~CTestLayer(void)@H_403_61@
- }@H_403_61@
- boolCTestLayer::init()@H_403_61@
- boolbRet=false;@H_403_61@
- do@H_403_61@
- CC_BREAK_IF(!CCLayer::init());@H_403_61@
- pthread_create(&sellA_pid,NULL,threadA,0);//创建线程A@H_403_61@
- pthread_create(&sellB_pid,threadB,0); background-color:inherit">//创建线程B@H_403_61@
- bRet=true;@H_403_61@
- }while(0);@H_403_61@
- returnbRet;@H_403_61@
- void*CTestLayer::threadA(void*p)@H_403_61@
- while(true)@H_403_61@
- if(tickets>0)@H_403_61@
- CCLog("ASell%d",tickets--);//输出售票,每次减1@H_403_61@
- else{@H_403_61@
- break;@H_403_61@
- returnNULL;@H_403_61@
- void*CTestLayer::threadB(void*p)@H_403_61@
- true)@H_403_61@
- if(tickets>0)@H_403_61@
- CCLog("BSell%d",tickets--);@H_403_61@
- else@H_403_61@
- }@H_403_61@
(1)同一张票卖了2次。
(2)后面的票比前面的票先卖出去。
(3)第0张票竟然也可以卖。(这算站票么。。。)
原因不多解释了,时间片的问题,不明白的Google之。如果你觉得不会有这么巧,那么在打印结果前加上这么一句:
copy