1.环境搭建
cocos2d-x中的多线程使用pthread就可以实现跨平台,而且也不是很难理解。使用pthread需要先配置一下工程。右击工程----->属性----->配置属性---->链接器----->输入---->附加依赖项中添加pthreadVCE2.lib,如下图
接着添加附加包含目录,右击项目,属性----->C/C++---->常规----->附加包含目录加入pthread头文件所在的目录
这样,环境就搭建起来了。
2.多线程的使用
使用pthread来实现多线程,最重要的一个函数是
[cpp]
view plain
copy
@H_403_44@
@H_403_44@
@H_403_44@
- PTW32_DLLPORTintPTW32_CDECLpthread_create(pthread_t*tid,//线程的标示
- constpthread_attr_t*attr,//创建线程的参数
- void*(*start)(void*),//入口函数的指针
- void*arg);//传递给线程的数据
[cpp]
view plain
copy
@H_403_44@
@H_403_44@
@H_403_44@
在HelloWorldScene.h文件中
- PTW32_DLLPORTintPTW32_CDECLpthread_create(pthread_t*tid,//线程的标示
- constpthread_attr_t*attr,//创建线程的参数
- void*(*start)(void*),//入口函数的指针
- void*arg);//传递给线程的数据
在HelloWorldScene.h文件中
copy
@H_403_44@
@H_403_44@
@H_403_44@
- pthread_tpidrun,pidgo;
- staticvoid*th_run(void*r);
- staticvoid*th_go(void*r);
copy
@H_403_44@
@H_403_44@
@H_403_44@
- pthread_tpidrun,pidgo;
- staticvoid*th_run(void*r);
- staticvoid*th_go(void*r);
然后自定义了一个类,用于给线程传递数据。Student类如下:
copy
@H_403_44@
@H_403_44@
@H_403_44@
- #pragmaonce
- #include<string>
- classStudent
- {
- public:
- Student(void);
- Student(std::stringname,intage,std::stringsex);
- ~Student(void);
- std::stringname;
- intage;
- std::stringsex;
- };
copy
@H_403_44@
@H_403_44@
@H_403_44@
源文件如下
- #pragmaonce
- #include<string>
- classStudent
- {
- public:
- Student(void);
- Student(std::stringname,intage,std::stringsex);
- ~Student(void);
- std::stringname;
- intage;
- std::stringsex;
- };
源文件如下
copy
@H_403_44@
@H_403_44@
@H_403_44@
- #include"Student.h"
- #include"cocos2d.h"
- Student::Student(void)
- {
- }
- Student::~Student(void)
- cocos2d::CCLog("deletedata");
- Student::Student(std::stringname,std::stringsex)
- this->name=name;
- this->age=age;
- this->sex=sex;
- }
copy
@H_403_44@
@H_403_44@
@H_403_44@
- #include"Student.h"
- #include"cocos2d.h"
- Student::Student(void)
- {
- }
- Student::~Student(void)
- cocos2d::CCLog("deletedata");
- Student::Student(std::stringname,std::stringsex)
- this->name=name;
- this->age=age;
- this->sex=sex;
- }
copy
@H_403_44@
@H_403_44@
@H_403_44@
- voidHelloWorld::menuCloseCallback(CCObject*pSender)
- Student*temp=newStudent(std::string("zhycheng"),23,std::string("male"));
- pthread_mutex_init(&mutex,NULL);
- pthread_create(&pidrun,NULL,th_run,temp);//启动线程
- pthread_create(&pidgo,th_go,0);
- }
copy
@H_403_44@
@H_403_44@
@H_403_44@
可以看到,将Student的指针传递给了pidrun线程,那么在pidrun线程中获得Student信息如下:
- voidHelloWorld::menuCloseCallback(CCObject*pSender)
- Student*temp=newStudent(std::string("zhycheng"),std::string("male"));
- pthread_mutex_init(&mutex,NULL);
- pthread_create(&pidrun,temp);//启动线程
- pthread_create(&pidgo,0);
- }
可以看到,将Student的指针传递给了pidrun线程,那么在pidrun线程中获得Student信息如下:
copy
@H_403_44@
@H_403_44@
@H_403_44@
- Student*s=(Student*)(r);
- CCLog("nameis%s,andageis%d,sexis%s",s->name.c_str(),s->age,s->sex.c_str());
- deletes;
copy
@H_403_44@
@H_403_44@
@H_403_44@
- Student*s=(Student*)(r);
- CCLog("nameis%s,sexis%s",s->sex.c_str());
- deletes;
3.线程同步
使用了线程,必然就要考虑到线程同步,不同的线程同时访问资源的话,访问的顺序是不可预知的,会造成不可预知的结果。
这里使用pthread_mutex_t来实现同步,下面我来演示一下使用多线程实现卖票系统。卖票的时候,是由多个窗口同时卖票,这里要做到一张票不要卖出去两次,不要出现有票却无法卖的结果。
在线程函数th_run和th_go中来卖票,票的数量是一个全局变量,每卖出去一张票,就将票的数量减一。其中同步的pthread_mutex_t也是一个全局变量,就用它来实现线程同步。
copy
@H_403_44@
@H_403_44@
@H_403_44@
- void*HelloWorld::th_run(void*r)
- Student*s=(Student*)(r);
- CCLog("nameis%s,s->sex.c_str());
- deletes;
- while(true)
- pthread_mutex_lock(&mutex);
- if(ticket>0)
- CCLog("threadrunsell%d",ticket);
- ticket--;
- pthread_mutex_unlock(&mutex);
- }
- else
- break;
- Sleep(1);
- //Usleep(10);
- returnNULL;
- copy
@H_403_44@ @H_403_44@ @H_403_44@
- void*HelloWorld::th_run(void*r)
- Student*s=(Student*)(r);
- CCLog("nameis%s,s->sex.c_str());
- deletes;
- while(true)
- pthread_mutex_lock(&mutex);
- if(ticket>0)
- CCLog("threadrunsell%d",ticket);
- ticket--;
- pthread_mutex_unlock(&mutex);
- }
- else
- break;
- Sleep(1);
- //Usleep(10);
- returnNULL;
- }
来自:http://blog.csdn.net/kaitiren/article/details/14453313
@H_403_44@