cocos2d-x中的多线程使用pthread就可以实现跨平台,而且也不是很难理解。使用pthread需要先配置一下工程。右击工程----->属性----->配置属性---->链接器----->输入---->附加依赖项中添加pthreadVCE2.lib,如下图
接着添加附加包含目录,右击项目,属性----->C/C++---->常规----->附加包含目录加入pthread头文件所在的目录
这样,环境就搭建起来了。
使用pthread来实现多线程,最重要的一个函数是
[cpp] view plain copy PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,//线程的标示 const pthread_attr_t * attr, //创建线程的参数 void *(*start) (void *), //入口函数的指针 void *arg); //传递给线程的数据 [cpp] view plain copy PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,//线程的标示 const pthread_attr_t * attr, //创建线程的参数 void *(*start) (void *), //入口函数的指针 void *arg); //传递给线程的数据 在HelloWorldScene.h文件中
[cpp] view plain copy pthread_t pidrun,pidgo; static void* th_run(void *r); static void* th_go(void *r); [cpp] view plain copy pthread_t pidrun,pidgo; static void* th_run(void *r); static void* th_go(void *r); 定义了两个函数和两个线程的标识。
然后自定义了一个类,用于给线程传递数据。Student类如下:
[cpp] view plain copy #pragma once #include <string> class Student { public: Student(void); Student(std::string name,int age,std::string sex); ~Student(void); std::string name; int age; std::string sex; }; [cpp] view plain copy #pragma once #include <string> class Student { public: Student(void); Student(std::string name,int age,std::string sex); ~Student(void); std::string name; int age; std::string sex; }; 源文件如下
[cpp] view plain copy #include "Student.h" #include "cocos2d.h" Student::Student(void) { } Student::~Student(void) { cocos2d::CCLog("delete data"); } Student::Student(std::string name,int age,std::string sex) { this->name=name; this->age=age; this->sex=sex; } [cpp] view plain copy #include "Student.h" #include "cocos2d.h" Student::Student(void) { } Student::~Student(void) { cocos2d::CCLog("delete data"); } Student::Student(std::string name,int age,std::string sex) { this->name=name; this->age=age; this->sex=sex; } 在退出菜单的回调函数中启动两个线程:
[cpp] view plain copy void HelloWorld::menuCloseCallback(CCObject* pSender) { Student *temp=new Student(std::string("zhycheng"),23,std::string("male")); pthread_mutex_init(&mutex,NULL); pthread_create(&pidrun,NULL,th_run,temp);//启动线程 pthread_create(&pidgo,NULL,th_go,0); } [cpp] view plain copy void HelloWorld::menuCloseCallback(CCObject* pSender) { Student *temp=new Student(std::string("zhycheng"),23,std::string("male")); pthread_mutex_init(&mutex,NULL); pthread_create(&pidrun,NULL,th_run,temp);//启动线程 pthread_create(&pidgo,NULL,th_go,0); } 可以看到,将Student的指针传递给了pidrun线程,那么在pidrun线程中获得Student信息如下:
[cpp] view plain copy Student *s=(Student*)(r); CCLog("name is %s,and age is %d,sex is %s",s->name.c_str(),s->age,s->sex.c_str()); delete s; [cpp] view plain copy Student *s=(Student*)(r); CCLog("name is %s,and age is %d,sex is %s",s->name.c_str(),s->age,s->sex.c_str()); delete s;
这里使用pthread_mutex_t来实现同步,下面我来演示一下使用多线程实现卖票系统。卖票的时候,是由多个窗口同时卖票,这里要做到一张票不要卖出去两次,不要出现有票却无法卖的结果。
在线程函数th_run和th_go中来卖票,票的数量是一个全局变量,每卖出去一张票,就将票的数量减一。其中同步的pthread_mutex_t也是一个全局变量,就用它来实现线程同步。
[cpp] view plain copy void* HelloWorld::th_run(void *r) { Student *s=(Student*)(r); CCLog("name is %s,and age is %d,sex is %s",s->name.c_str(),s->age,s->sex.c_str()); delete s; while(true) { pthread_mutex_lock(&mutex); if(ticket>0) { CCLog("thread run sell %d",ticket); ticket--; pthread_mutex_unlock(&mutex); } else { pthread_mutex_unlock(&mutex); break; } Sleep(1); //Usleep(10); } return NULL; } [cpp] view plain copy void* HelloWorld::th_run(void *r) { Student *s=(Student*)(r); CCLog("name is %s,and age is %d,sex is %s",s->name.c_str(),s->age,s->sex.c_str()); delete s; while(true) { pthread_mutex_lock(&mutex); if(ticket>0) { CCLog("thread run sell %d",ticket); ticket--; pthread_mutex_unlock(&mutex); } else { pthread_mutex_unlock(&mutex); break; } Sleep(1); //Usleep(10); } return NULL; }
来自:http://blog.csdn.net/kaitiren/article/details/14453313
