多线程和同步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

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线

MySQL主从同步延迟原理及解决方案

概述 MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力; ②在从主服务器进行备份,避免备份期间影响主服务器服务; ③当主服务器出现问题时,可以切换到从服务器。 相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? MyS

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4