多线程和同步01-pthread库

2024-06-02 07:08
文章标签 多线程 01 同步 pthread

本文主要是介绍多线程和同步01-pthread库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/14118939


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


1.配置

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


1.1.头文件

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



1.2.库文件

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


2.pthread库


2.1.主要功能

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

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

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

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

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


2.2.命名规则



3.线程和互斥对象

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


3.1.线程

[cpp] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //创建线程  
  2. PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,  
  3.                             const pthread_attr_t * attr,  
  4.                             void *(*start) (void *),  
  5.                             void *arg);  
  6.   
  7. //退出线程  
  8. PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr);  
  9.   
  10. //取消执行线程  
  11. PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread);  
  12.   
  13. //删除线程  
  14. PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid);  
  15.   
  16. //加入线程  
  17. PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread,  
  18.                           void **value_ptr);  
  19.   
  20. //初始化线程属性  
  21. PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr);  
  22.   
  23. //清理线程属性  
  24. PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr);  

3.2.互斥对象

[cpp] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //初始化mutex  
  2. PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex,  
  3.                                 const pthread_mutexattr_t * attr);  
  4.   
  5. //销毁mutex,要注意如果是new的指针,需要手动释放,pthread_mutex_destroy并不会帮你释放  
  6. PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex);  
  7.   
  8. //加锁  
  9. PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex);  
  10.   
  11. //尝试加锁  
  12. PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex);  
  13.   
  14. //解锁  
  15. PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex);  
要注意的是mutex变量必须要被声明为pthread_mutex_t类型,且在使用前必须要被初始化,初始化有2种方式:

(1)静态初始化

[cpp] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;  
(2)动态初始化
[cpp] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. pthread_mutex_init();  

4.注意

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也不是线程安全。


这篇关于多线程和同步01-pthread库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023284

相关文章

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可