cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题

    xiaoxiao2025-12-02  9

    ocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作放到了主线程中,游戏的界面就会卡,这是不能容忍的,游戏最基本的条件就是流畅性,这就是为什么游戏开发选择C++的原因。另外现在双核手机和四核手机越来越普遍了,是时候使用多线程来挖掘硬件的潜力了。

    1.环境搭建

    cocos2d-x中的多线程使用pthread就可以实现跨平台,而且也不是很难理解。使用pthread需要先配置一下工程。右击工程----->属性----->配置属性---->链接器----->输入---->附加依赖项中添加pthreadVCE2.lib,如下图

    接着添加附加包含目录,右击项目,属性----->C/C++---->常规----->附加包含目录加入pthread头文件所在的目录

    这样,环境就搭建起来了。

    2.多线程的使用

    使用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;  

    3.线程同步

    使用了线程,必然就要考虑到线程同步,不同的线程同时访问资源的话,访问的顺序是不可预知的,会造成不可预知的结果。

    这里使用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

    转载请注明原文地址: https://ju.6miu.com/read-1304520.html
    最新回复(0)