原创作品,转载请标明:@H_301_6@http://www.jb51.cc/article/p-ntfjuwne-ep.html
@H_301_6@
@H_301_6@
pthread有很多不同应用,官网都有相应的API解释和Sample,这里不再重复,本文主要介绍一个cocos2d-x多线程和同步示例。@H_301_6@
@H_301_6@
1.售票@H_301_6@
孙鑫老师的C++和Java多线程售票一直让我念念不忘,好吧,这里用cocos2d-x和pthread实现一个吧。总共有100张火车票,有2个售票点A和B再售票,当票卖完了就结束了。我们知道当程序一开始进程就会创建一个主线程,所以可以在主线程基础上再创建2个线程A和B,再线程A和B中分别售票,当票数为0的时候,结束线程A和B。@H_301_6@
2.多线程售票@H_301_6@
@H_301_6@
- //TestLayer.h@H_301_6@@H_301_6@@H_301_6@
- class@H_301_6@CTestLayer:@H_301_6@@H_301_6@
- public@H_301_6@CCLayer@H_301_6@@H_301_6@
- {@H_301_6@
- public@H_301_6@:@H_301_6@@H_301_6@
- CTestLayer(void@H_301_6@);@H_301_6@@H_301_6@
- ~CTestLayer(void@H_301_6@);@H_301_6@@H_301_6@
- @H_301_6@
- CREATE_FUNC(CTestLayer);@H_301_6@
- virtual@H_301_6@@H_301_6@bool@H_301_6@init();@H_301_6@@H_301_6@
- @H_301_6@
- pthread_tsellA_pid,sellB_pid;//线程id@H_301_6@@H_301_6@@H_301_6@
- static@H_301_6@@H_301_6@int@H_301_6@tickets;@H_301_6@//票数@H_301_6@@H_301_6@@H_301_6@
- static@H_301_6@@H_301_6@void@H_301_6@*threadA(@H_301_6@void@H_301_6@*p);@H_301_6@//线程A回调@H_301_6@@H_301_6@@H_301_6@
- void@H_301_6@*threadB(@H_301_6@//线程B回调@H_301_6@@H_301_6@@H_301_6@
- };@H_301_6@
- //TestLayer.cpp@H_301_6@@H_301_6@@H_301_6@
- #include"TestLayer.h"@H_301_6@@H_301_6@@H_301_6@
- int@H_301_6@CTestLayer::tickets=100;@H_301_6@//初始化票数100@H_301_6@@H_301_6@@H_301_6@
- CTestLayer::CTestLayer(void@H_301_6@)@H_301_6@@H_301_6@
- {@H_301_6@
- }@H_301_6@
- CTestLayer::~CTestLayer(void@H_301_6@)@H_301_6@@H_301_6@
- }@H_301_6@
- bool@H_301_6@CTestLayer::init()@H_301_6@@H_301_6@
- bool@H_301_6@bRet=@H_301_6@false@H_301_6@;@H_301_6@@H_301_6@
- do@H_301_6@@H_301_6@@H_301_6@
- CC_BREAK_IF(!CCLayer::init());@H_301_6@
- pthread_create(&sellA_pid,NULL,threadA,0);//创建线程A@H_301_6@@H_301_6@@H_301_6@
- pthread_create(&sellB_pid,threadB,0); background-color:inherit">//创建线程B@H_301_6@@H_301_6@@H_301_6@
- bRet=true@H_301_6@;@H_301_6@@H_301_6@
- }while@H_301_6@(0);@H_301_6@@H_301_6@
- return@H_301_6@bRet;@H_301_6@@H_301_6@
- void@H_301_6@*CTestLayer::threadA(@H_301_6@void@H_301_6@*p)@H_301_6@@H_301_6@
- while@H_301_6@(@H_301_6@true@H_301_6@)@H_301_6@@H_301_6@
- if@H_301_6@(tickets>0)@H_301_6@@H_301_6@
- CCLog("ASell%d"@H_301_6@,tickets--);@H_301_6@//输出售票,每次减1@H_301_6@@H_301_6@@H_301_6@
- else@H_301_6@{@H_301_6@@H_301_6@
- break@H_301_6@;@H_301_6@@H_301_6@
- return@H_301_6@NULL;@H_301_6@@H_301_6@
- void@H_301_6@*CTestLayer::threadB(@H_301_6@void@H_301_6@*p)@H_301_6@@H_301_6@
- true@H_301_6@)@H_301_6@@H_301_6@
- if@H_301_6@(tickets>0)@H_301_6@@H_301_6@
- CCLog("BSell%d"@H_301_6@,tickets--);@H_301_6@@H_301_6@
- else@H_301_6@@H_301_6@@H_301_6@
- }@H_301_6@
(1)同一张票卖了2次。@H_301_6@
(2)后面的票比前面的票先卖出去。@H_301_6@
(3)第0张票竟然也可以卖。(这算站票么。。。)@H_301_6@
原因不多解释了,时间片的问题,不明白的Google之。如果你觉得不会有这么巧,那么在打印结果前加上这么一句:@H_301_6@
@H_301_6@