多线程以及线程同步
来源:互联网 发布:php session cookie 编辑:程序博客网 时间:2024/06/05 20:37
原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9116479
cocos2d-x引擎在内部实现了一个庞大的主循环,每帧之间更新界面,如果耗时的操作放到了主线程中,游戏的界面就会卡,这是不能容忍的,游戏最基本的条件就是流畅性,这就是为什么游戏开发选择C++的原因。另外现在双核手机和四核手机越来越普遍了,是时候使用多线程来挖掘硬件的潜力了。
1.环境搭建
cocos2d-x中的多线程使用pthread就可以实现跨平台,而且也不是很难理解。使用pthread需要先配置一下工程。右击工程----->属性----->配置属性---->链接器----->输入---->附加依赖项中添加pthreadVCE2.lib,如下图
接着添加附加包含目录,右击项目,属性----->C/C++---->常规----->附加包含目录加入pthread头文件所在的目录
这样,环境就搭建起来了。
2.多线程的使用
使用pthread来实现多线程,最重要的一个函数是
- PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,//线程的标示
- const pthread_attr_t * attr, //创建线程的参数
- void *(*start) (void *), //入口函数的指针
- void *arg); //传递给线程的数据
PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,//线程的标示 const pthread_attr_t * attr, //创建线程的参数 void *(*start) (void *), //入口函数的指针 void *arg); //传递给线程的数据
在HelloWorldScene.h文件中
- pthread_t pidrun,pidgo;
- static void* th_run(void *r);
- static void* th_go(void *r);
pthread_t pidrun,pidgo;static void* th_run(void *r);static void* th_go(void *r);定义了两个函数和两个线程的标识。
然后自定义了一个类,用于给线程传递数据。Student类如下:
- #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;
- };
#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;};
源文件如下
- #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;
- }
#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;}在退出菜单的回调函数中启动两个线程:
- 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);
- }
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信息如下:
- 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;
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也是一个全局变量,就用它来实现线程同步。
- 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;
- }
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;}
- void* HelloWorld::th_go(void *r)
- {
- while(true)
- {
- pthread_mutex_lock(&mutex);
- if(ticket>0)
- {
- CCLog("thread go sell %d",ticket);
- ticket--;
- pthread_mutex_unlock(&mutex);
- }
- else
- {
- pthread_mutex_unlock(&mutex);
- break;
- }
- Sleep(1);
- }
- return NULL;
- }
void* HelloWorld::th_go(void *r){while(true){pthread_mutex_lock(&mutex);if(ticket>0){CCLog("thread go sell %d",ticket);ticket--;pthread_mutex_unlock(&mutex);}else{pthread_mutex_unlock(&mutex);break;}Sleep(1);}return NULL;}
mutex被锁定后,其他线程若再想锁定mutex的话,必须等待,当该线程释放了mutex之后,其他线程才能锁定mutex。Sleep()函数可以使得该线程休眠,单位是毫秒。下面是卖票的结果:
- name is zhycheng,and age is 23,sex is male
- delete data
- thread run sell 100
- thread run sell 99
- thread go sell 98
- thread go sell 97
- thread run sell 96
- thread go sell 95
- thread go sell 94
- thread run sell 93
- thread go sell 92
- thread run sell 91
- thread go sell 90
- thread go sell 89
- thread run sell 88
- thread go sell 87
- thread run sell 86
- thread go sell 85
- thread run sell 84
- thread go sell 83
- thread run sell 82
- thread go sell 81
- thread run sell 80
- thread go sell 79
- thread run sell 78
- thread go sell 77
- thread run sell 76
- thread go sell 75
- thread run sell 74
- thread go sell 73
- thread run sell 72
- thread go sell 71
- thread run sell 70
- thread go sell 69
- thread go sell 68
- thread run sell 67
- thread go sell 66
- thread run sell 65
- thread go sell 64
- thread run sell 63
- thread go sell 62
- thread run sell 61
- thread go sell 60
- thread run sell 59
- thread go sell 58
- thread run sell 57
- thread go sell 56
- thread run sell 55
- thread go sell 54
- thread run sell 53
- thread run sell 52
- thread go sell 51
- thread run sell 50
- thread go sell 49
- thread run sell 48
- thread go sell 47
- thread run sell 46
- thread go sell 45
- thread run sell 44
- thread run sell 43
- thread go sell 42
- thread run sell 41
- thread run sell 40
- thread go sell 39
- thread run sell 38
- thread run sell 37
- thread run sell 36
- thread run sell 35
- thread go sell 34
- thread run sell 33
- thread run sell 32
- thread go sell 31
- thread run sell 30
- thread run sell 29
- thread run sell 28
- thread run sell 27
- thread run sell 26
- thread run sell 25
- thread go sell 24
- thread run sell 23
- thread go sell 22
- thread go sell 21
- thread run sell 20
- thread go sell 19
- thread run sell 18
- thread run sell 17
- thread go sell 16
- thread run sell 15
- thread go sell 14
- thread go sell 13
- thread run sell 12
- thread go sell 11
- thread go sell 10
- thread run sell 9
- thread go sell 8
- thread run sell 7
- thread go sell 6
- thread go sell 5
- thread run sell 4
- thread go sell 3
- thread run sell 2
- thread run sell 1
name is zhycheng,and age is 23,sex is maledelete datathread run sell 100thread run sell 99thread go sell 98thread go sell 97thread run sell 96thread go sell 95thread go sell 94thread run sell 93thread go sell 92thread run sell 91thread go sell 90thread go sell 89thread run sell 88thread go sell 87thread run sell 86thread go sell 85thread run sell 84thread go sell 83thread run sell 82thread go sell 81thread run sell 80thread go sell 79thread run sell 78thread go sell 77thread run sell 76thread go sell 75thread run sell 74thread go sell 73thread run sell 72thread go sell 71thread run sell 70thread go sell 69thread go sell 68thread run sell 67thread go sell 66thread run sell 65thread go sell 64thread run sell 63thread go sell 62thread run sell 61thread go sell 60thread run sell 59thread go sell 58thread run sell 57thread go sell 56thread run sell 55thread go sell 54thread run sell 53thread run sell 52thread go sell 51thread run sell 50thread go sell 49thread run sell 48thread go sell 47thread run sell 46thread go sell 45thread run sell 44thread run sell 43thread go sell 42thread run sell 41thread run sell 40thread go sell 39thread run sell 38thread run sell 37thread run sell 36thread run sell 35thread go sell 34thread run sell 33thread run sell 32thread go sell 31thread run sell 30thread run sell 29thread run sell 28thread run sell 27thread run sell 26thread run sell 25thread go sell 24thread run sell 23thread go sell 22thread go sell 21thread run sell 20thread go sell 19thread run sell 18thread run sell 17thread go sell 16thread run sell 15thread go sell 14thread go sell 13thread run sell 12thread go sell 11thread go sell 10thread run sell 9thread go sell 8thread run sell 7thread go sell 6thread go sell 5thread run sell 4thread go sell 3thread run sell 2thread run sell 1
可以看到,这个打印结果正确无误。如果不加mutex会是什么样的结果呢,我将线程同步的mutex注释掉,输出的结果为:
- name is zhycheng,and age is 23,sex is male
- delete data
- thread run sell 100
- thread run sell 99
- thread run sell 98
- thread go sell 97
- thread run sell 96
- thread go sell 95
- thread run sell 94
- thread go sell 94
- thread run sell 92
- thread run sell 91
- thread go sell 90
- thread run sell 89
- thread go sell 88
- thread run sell 87
- thread run sell 86
- thread go sell 86
- thread go sell 84
- thread run sell 83
- thread go sell 82
- thread run sell 81
- thread go sell 80
- thread run sell 79
- thread run sell 78
- thread go sell 77
- thread run sell 76
- thread run sell 75
- thread go sell 74
- thread run sell 73
- thread go sell 72
- thread run sell 71
- thread go sell 70
- thread go sell 69
- thread run sell 68
- thread go sell 67
- thread go sell 66
- thread run sell 65
- thread go sell 64
- thread go sell 63
- thread run sell 62
- thread go sell 61
- thread run sell 60
- thread run sell 59
- thread run sell 58
- thread run sell 57
- thread run sell 56
- thread run sell 55
- thread go sell 54
- thread run sell 54
- thread go sell 52
- thread run sell 52
- thread go sell 50
- thread run sell 50
- thread go sell 49
- thread run sell 47
- thread go sell 47
- thread go sell 45
- thread run sell 45
- thread run sell 43thread go sell 43
- thread run sell 41
- thread go sell 41
- thread go sell 39
- thread run sell 39
- thread run sell 37
- thread go sell 37
- thread go sell 35
- thread run sell 35
- thread go sell 33thread run sell 33
- thread go sell 31thread run sell 31
- thread go sell 29
- thread run sell 29
- thread go sell 27
- thread run sell 27
- thread go sell 25
- thread run sell 25
- thread run sell 23
- thread go sell 23
- thread run sell 21
- thread go sell 21
- thread go sell 19
- thread run sell 19
- thread run sell 17
- thread go sell 17
- thread go sell 15
- thread run sell 15
- thread run sell 13
- thread go sell 13
- thread run sell 11thread go sell 11
- thread go sell 9
- thread run sell 9
- thread run sell 7
- thread go sell 7
- thread go sell 5thread run sell 5
- thread go sell 3
- thread run sell 3
- thread go sell 1
- thread run sell 1
name is zhycheng,and age is 23,sex is maledelete datathread run sell 100thread run sell 99thread run sell 98thread go sell 97thread run sell 96thread go sell 95thread run sell 94thread go sell 94thread run sell 92thread run sell 91thread go sell 90thread run sell 89thread go sell 88thread run sell 87thread run sell 86thread go sell 86thread go sell 84thread run sell 83thread go sell 82thread run sell 81thread go sell 80thread run sell 79thread run sell 78thread go sell 77thread run sell 76thread run sell 75thread go sell 74thread run sell 73thread go sell 72thread run sell 71thread go sell 70thread go sell 69thread run sell 68thread go sell 67thread go sell 66thread run sell 65thread go sell 64thread go sell 63thread run sell 62thread go sell 61thread run sell 60thread run sell 59thread run sell 58thread run sell 57thread run sell 56thread run sell 55thread go sell 54thread run sell 54thread go sell 52thread run sell 52thread go sell 50thread run sell 50thread go sell 49thread run sell 47thread go sell 47thread go sell 45thread run sell 45thread run sell 43thread go sell 43thread run sell 41thread go sell 41thread go sell 39thread run sell 39thread run sell 37thread go sell 37thread go sell 35thread run sell 35thread go sell 33thread run sell 33thread go sell 31thread run sell 31thread go sell 29thread run sell 29thread go sell 27thread run sell 27thread go sell 25thread run sell 25thread run sell 23thread go sell 23thread run sell 21thread go sell 21thread go sell 19thread run sell 19thread run sell 17thread go sell 17thread go sell 15thread run sell 15thread run sell 13thread go sell 13thread run sell 11thread go sell 11thread go sell 9thread run sell 9thread run sell 7thread go sell 7thread go sell 5thread run sell 5thread go sell 3thread run sell 3thread go sell 1thread run sell 1
可以看到,有的票卖了两次,有的票就没卖。
4.注意
1.Sleep()函数是使得线程休眠的函数,这个函数不跨平台,仅仅在windows上能用,其他平台使用usleep。
2.在非主线程中不能使用cocos2d-x管理内存的CCObject::retain()
, CCObject::release()
者CCObject::autorelease(),因为CCAutoreleasePool不是线程安全的,OPENGL的上下文也不是线程安全的,所以不要再非主线程中使用cocos2d-x的API和UI操作。
- 多线程以及线程同步
- 多线程以及线程同步
- 多线程以及线程同步
- 多线程以及线程同步
- cocos2dx多线程以及线程同步
- JAVA多线程并发同步,以及线程终止
- cocos2d-x 多线程以及线程同步
- cocos2d-x 多线程以及线程同步(转)
- cocos2d-x 多线程以及线程同步
- Linux下多线程实现以及线程同步
- C#多线程同步以及子线程调用主线程控件
- ios多线程之NSThread,GCD,NSOperation以及线程同步
- ios多线程之NSThread,GCD,NSOperation以及线程同步
- ios多线程之NSThread,GCD,NSOperation以及线程同步
- ios多线程之NSThread,GCD,NSOperation以及线程同步
- Java线程,多线程,线程同步,以及Java回调线程,还有难懂的synchronized
- C# 多线程学习系列三:线程优先级、线程同步以及向线程传递参数
- 多线程-线程同步
- 数据结构之数组处理串函数
- 【J2EE性能分析篇】JVM参数对J2EE性能优化的影响【转】
- CentOS 6.5下安装MPlayer
- GetModuleFileName函数
- 如何调用迭代器iterator
- 多线程以及线程同步
- 集群感知
- php下protobuf的安装使用
- Animated grass using LibGDX
- oracle11g卸载
- 浓缩才是精华:《iOS人机交互手册》九大要点
- 整合iis+tomcat
- 孙其功陪你学之——ubuntu与windows文件共享
- linux下javah生成jni本地方法