【玩转cocos2d-x之二十一】多线程和同步01-pthread库

和其他框架一样,cocos2d-x允许我们使用多线程进行编程。cocos2d-x v2.2.0使用的是pthread库,是一套用户级线程库,被广泛地使用在跨平台应用上。

配置

在使用pthread之前,需要把头文件和库文件链接进来。pthread的官网戳这里,当然cocos2d-x帮我们包含进引擎了。

头文件

pthread.h放在\cocos2d-x目录\cocos2dx\platform\third_party\win32\pthread\下,右键项目→属性→配置属性→C/C++→附加包含目录添加如下,这里要注意附加包含目录是只包含当前目录下的文件,而不会包含该目录下子目录。



库文件

一样的,右键项目→属性→配置属性→链接器→输入→附加依赖项,添加pthreadVCE2.lib即可。v2.2.0会自动包含,这步可省。

pthread库

主要功能

pthread库包含了四大部分功能:

(1)Thread Management:线程管理。提供了线程的创建,删除,结束等功能,也包含了对线程属性的修改和设置。

(2)Mutexex:互斥对象。用于处理同步机制。提供了创建,销毁,加锁,解锁等功能,也包含了对互斥对象属性的修改和设置。

(3)Condition variables:条件变量。提供了基于程序员提供条件的进程间通讯互斥锁的操作,包含了对其属性的修改和设置。

(4)Synchronization:同步相关。提供了操作读写锁等功能。

命名规则



线程和互斥对象

我们这里主要了解线程和互斥对象,也是最常用到的。

线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//创建线程  
PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,
const pthread_attr_t * attr,
void *(*start) (void *),
void *arg);

//退出线程
PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr);

//取消执行线程
PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread);

//删除线程
PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid);

//加入线程
PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread,
void **value_ptr);

//初始化线程属性
PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr);

//清理线程属性
PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr);

互斥对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//初始化mutex  
PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex,
const pthread_mutexattr_t * attr)
;


//销毁mutex,要注意如果是new的指针,需要手动释放,pthread_mutex_destroy并不会帮你释放
PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex);

//加锁
PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex);

//尝试加锁
PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex);

//解锁
PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex);

要注意的是mutex变量必须要被声明为pthread_mutex_t类型,且在使用前必须要被初始化,初始化有2种方式:

(1)静态初始化

1
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

(2)动态初始化

1
pthread_mutex_init();

注意

cocos2d-x使用多线程应注意的问题(来自官方文档):

(1)不能调用涉及到CCObject::retain(), CCObject::release() 或者 CCObject::autorelease()的函数,因为CCAutoreleasePool不是线程安全的。因为cocos2d-x框架中无处不在使用CCAutoreleasePool,所以建议不要在新线程中调用cocos2d-x的API。

(2)如果要在新线程中加载资源,那么可以使用CCTextureCache::addImageAsync()。

(3)pthread_cond_wait()看起来有个bug,首次wait会失败,但是之后又会工作的很好。

(4)OpenGL context也不是线程安全。

文章目录
  1. 1. 配置
    1. 1.1. 头文件
    2. 1.2. 库文件
  2. 2. pthread库
    1. 2.1. 主要功能
    2. 2.2. 命名规则
  3. 3. 线程和互斥对象
    1. 3.1. 线程
    2. 3.2. 互斥对象
  4. 4. 注意
,