- 浏览: 1340676 次
- 性别:
- 来自: 成都
-
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
转自 http://www.dreamingwish.com/dream-2012/gcd-four-the-the-odds-and-ends.html
Dispatch Queue挂起
dispatch queue可以被挂起和恢复。使用 dispatch_suspend
函数来挂起,使用 dispatch_resume
函数来恢复。这两个函数的行为是如你所愿的。另外,这两个还是也可以用于dispatch source。
一个要注意的地方是,dispatch queue的挂起是block粒度的。换句话说,挂起一个queue并不会将当前正在执行的block挂起。它会允许当前执行的block执行完毕,然后后续的block不再会被执行,直至queue被恢复。
还有一个注意点:从man页上得来的:如果你挂起了一个queue或者source,那么销毁它之前,必须先对其进行恢复。
Dispatch Queue目标指定
所有的用户队列都有一个目标队列概念。从本质上讲,一个用户队列实际上是不执行任何任务的,但是它会将任务传递给它的目标队列来执行。通常,目标队列是默认优先级的全局队列。
用户队列的目标队列可以用函数 dispatch_set_target_queue
来修改。我们可以将任意dispatch queue传递给这个函数,甚至可以是另一个用户队列,只要别构成循环就行。这个函数可以用来设定用户队列的优先级。比如我们可以将用户队列的目标队列设定为低优先级的全局队列,那么我们的用户队列中的任务都会以低优先级执行。高优先级也是一样道理。
有一个用途,是将用户队列的目标定为main queue。这会导致所有提交到该用户队列的block在主线程中执行。这样做来替代直接在主线程中执行代码的好处在于,我们的用户队列可以单独地被挂起和恢复,还可以被重定目标至一个全局队列,然后所有的block会变成在全局队列上执行(只要你确保你的代码离开主线程不会有问题)。
还有一个用途,是将一个用户队列的目标队列指定为另一个用户队列。这样做可以强制多个队列相互协调地串行执行,这样足以构建一组队列,通过挂起和暂停那个目标队列,我们可以挂起和暂停整个组。想象这样一个程序:它扫描一组目录并且加载目录中的内容。为了避免磁盘竞争,我们要确定在同一个物理磁盘上同时只有一个文件加载任务在执行。而希望可以同时从不同的物理磁盘上读取多个文件。要实现这个,我们要做的就是创建一个dispatch queue结构,该结构为磁盘结构的镜像。
首先,我们会扫描系统并找到各个磁盘,为每个磁盘创建一个用户队列。然后扫描文件系统,并为每个文件系统创建一个用户队列,将这些用户队列的目标队列指向合适的磁盘用户队列。最后,每个目录扫描器有自己的队列,其目标队列指向目录所在的文件系统的队列。目录扫描器枚举自己的目录并为每个文件向自己的队列提交一个block。由于整个系统的建立方式,就使得每个物理磁盘被串行访问,而多个物理磁盘被并行访问。除了队列初始化过程,我们根本不需要手动干预什么东西。
信号量
dispatch的信号量是像其他的信号量一样的,如果你熟悉其他多线程系统中的信号量,那么这一节的东西再好理解不过了。
信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。
我们使用函数 dispatch_semaphore_create
来创建dispatch信号量,使用函数 dispatch_semaphore_signal
来信号通知,使用函数dispatch_semaphore_wait
来等待。这些函数的man页有两个很好的例子,展示了怎样使用信号量来同步任务和有限资源访问控制。
单次初始化
GCD还提供单词初始化支持,这个与pthread中的函数 pthread_once
很相似。GCD提供的方式的优点在于它使用block而非函数指针,这就允许更自然的代码方式:
这个特性的主要用途是惰性单例初始化或者其他的线程安全数据共享。典型的单例初始化技术看起来像这样(线程安全的):
+ (id)sharedWhatever { static Whatever *whatever = nil; @synchronized([Whatever class]) { if(!whatever) whatever = [[Whatever alloc] init]; } return whatever; }
这挺好的,但是代价比较昂贵;每次调用 +sharedWhatever
函数都会付出取锁的代价,即使这个锁只需要进行一次。确实有更风骚的方式来实现这个,使用类似双向锁或者是原子操作的东西,但是这样挺难弄而且容易出错。
使用GCD,我们可以这样重写上面的方法,使用函数 dispatch_once
:
+ (id)sharedWhatever { static dispatch_once_t pred; static Whatever *whatever = nil; dispatch_once(&pred, ^{ whatever = [[Whatever alloc] init]; }); return whatever; }
这个稍微比 @synchronized
方法简单些,并且GCD确保以更快的方式完成这些检测,它保证block中的代码在任何线程通过 dispatch_once
调用之前被执行,但它不会强制每次调用这个函数都让代码进行同步控制。实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载。
结论
这一章,我们介绍了dispatch queue的挂起、恢复和目标重定,以及这些功能的一些用途。另外,我们还介绍了如何使用dispatch 信号量和单次初始化功能。到此,我已经完成了GCD如何运作以及如何使用的介绍。
评论
那请问怎么退出 gcd线程
发表评论
-
ios 声音合成
2013-08-18 13:20 1307http://stackoverflow.com/ques ... -
__bridge,__bridge_retained和__bridge_transfer的意思,区别与使用 20 三
2012-12-24 01:41 1734使用ARC能帮我们减轻不少内存管理方面的负担,尤其是对用 ... -
CAAnimation
2012-12-23 01:09 2367CAAnimation采用了CAMediaTi ... -
UIViewAnimation动画与Core Animation的CATransition类动画
2012-12-23 01:06 2772使用UIView类函数实现://U ... -
GCD实战2:资源竞争
2012-12-23 01:04 1616转自http://www.dreamingwish.co ... -
GCD实战一:使用串行队列实现简单的预加载
2012-12-22 17:10 2940转自 http://www.dreamingwish.c ... -
GCD介绍(三): Dispatch Sources
2012-12-22 17:07 1680转自 http://www.dreamingwish.com/ ... -
GCD介绍(二): 多核心的性能
2012-12-22 17:05 1229转自http://www.dreamingwish.co ... -
基本概念和Dispatch Queue
2012-12-22 17:03 1421转自 http://www.dreamingwish.c ... -
Best Audio Format for iPhone Audio Programming
2012-12-19 16:26 2602I had never done audio p ... -
LAME 是一个开源的MP3解码编码工具
2012-12-19 13:09 8652MP3 Encoding * 编码MP3文件必须按如下 ... -
sqlite3中的数据类型
2012-12-10 21:37 1360(转)http://www.cnblogs.com/kfqco ... -
ios随机数,and()、random()、arc4random()
2012-11-15 11:06 4746原文:http://bj007.blog.51cto.c ... -
IPHONE GIF 播放的方式
2012-10-11 18:30 1475转 http://blog.csdn.net/zltia ... -
在新线程中使用NSTimer
2012-10-11 18:21 1603转自 http://blog.csdn.net/sjzs ... -
Creating an iPhone Daemon – Part 5
2012-09-02 15:29 1549Creating an iPhone Daemon – ... -
Creating an iPhone Daemon – Part 4
2012-09-02 15:28 1418Creating an iPhone Daemon – ... -
Creating an iPhone Daemon – Part 3
2012-09-02 15:25 1516This is part three of the bl ... -
Creating an iPhone Daemon – Part 2
2012-09-02 15:24 1273Here is part two of the blog ... -
Creating an iPhone Daemon – Part 1
2012-09-02 15:23 1178So I thought I would start t ...
相关推荐
本程序通过selenium库和random库调用Google Chrome浏览器模拟人的手工操作,通过在关键词查询框里随机输入关键词、并设置键入的时间间隔模拟人的输入行为,然后再控制浏览器随机翻页,真正像普通人一样操作浏览器规避亚马逊的防爬虫机制。根据预定的关键词列表查询产品,然后通过BeautifulSoup解析查询结果获取亚马逊产品的价格、标题、ASIN、评论等信息,并将这些产品保存为本地csv文件,方便在Excel里分析处理。
微信诗词鉴赏小程序【基于微信小程序的在线诗词鉴赏平台】是一个以微信小程序为载体,专注于古代诗词鉴赏的项目 此项目旨在打造一个便捷、全面的移动端诗词学习与交流平台,让用户能够随时随地沉浸在中华
【毕业设计】Python的Django-vue的摄影交流平台源码(完整前后端+mysql+说明文档+LW+PPT).zip
基于Matlab Simulink的三相两电平逆变器矢量控制系统的仿真波形动态分析及其性能优化研究报告,基于Matlab Simulink仿真平台下的两电平逆变器矢量控制系统动态分析及其波形研究,基于Matlab Simulink的两电平逆变器矢量控制系统的仿真波形的动态分析 不,需要的资料,文档有 ,基于Matlab; Simulink; 两电平逆变器; 矢量控制系统; 仿真波形; 动态分析,基于Simulink的逆变器矢量控制系统动态仿真分析
【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:FinsDLL文件及调用手册 资源类型:程序源代码 源码说明:本人依据 Omron 通讯手册 编写的.DLL 使用 C# 开发 可以实现 对 OMRON PLC 内部寄存器 D区 M区 CIO区 HR区 字 。位 的 读写操作 以及 AR 区 字、位的读操作。使用方便 直接按照调用手册 操作步骤即可实现读写功能。 适合人群:新手及有一定经验的开发人员。内容来源于网络分享,如有侵权请联系我删除。
资源说明:https://editor.csdn.net/md/?articleId=129220710#323_oled_148 本设计的电梯系统采用的是stm32微处理器。STM32处理器是基于Cortex-M3架构的嵌入式微处理器MCU,其中Cortex-M3架构是ARM公司推出的。STM32处理器具有高速、高集成度、低功耗、高可靠性等优点。正是由于STM32处理器具有这些优点,它正适合运用于电梯控制。本设计中的电梯控制系统主要运用了STM32处理器GPIO口操作和其精确地定时功能。该电梯系统一共分6个部分,它们是 STM32处理器、电源系统、数码管显示器、键盘、LED小灯、直流电机驱动模块。这些部分是直接与STM32的GPIO口连接的,所以它们占用的GPIO口较多。 各功能模块简介: (1)电源系统:为整个系统提供+5V电源; (2)键盘:每个键位互不影响用以控制电梯运行状态; (3)LED指示小灯:用以指示小健是否被按下和电梯门开关状态; (4)4位8段数码管:用于显示电梯内部和每层电梯外部电梯所在的层数; STM32开发板:通过写入程序代码来控制电梯的运行状态。。。。。。。
推荐Matlab人脸识别源码合集(包含PCA、Adaboost、DLDA、费舍尔算法等)及多语言参考,推荐Matlab人脸识别源码合集(包含PCA、Adaboost、DLDA、费舍尔算法等多套实现),Matlab人脸识别源码6套,可运行(包括PCA算法,Adaboost算法,DLDA算法,费舍尔算法等)。 另含多套文档及JAVA,PYTHON,C#,OPENCV人脸识别源码可供参考 源码很多,请优先选择Matlab文件夹且标题里含有(推荐)标识者 ,Matlab人脸识别源码; PCA算法; Adaboost算法; DLDA算法; 费舍尔算法; JAVA,PYTHON,C#人脸识别源码; OPENCV人脸识别源码; 推荐标识; 优先选择Matlab文件夹。,Matlab人脸识别源码合集(推荐PCA、Adaboost、DLDA算法,含多套文档及跨平台源码)
分割资源UE5.3.z21重传
Labview操作者框架结合ADS与Twincat控制器:ST语言与EtherCAT总线控制工程项目资料,LabVIEW操作者框架结合ADS与Twincat控制器:Ethercat总线控制工程项目资料,labview操作者框架+ADS+twincat2(twincat3) st语言ethercat总线控制工程项目资料 twincat控制器+twincat资料 到手能用,labview界面+控制器 ,labview操作者框架; ADS; twincat2/3; st语言; ethercat总线控制; 控制器; 可用资料,LabVIEW操作者框架与TwinCAT控制器:Ethercat总线控制工程项目资料
基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型Matlab Simulink仿真效果研究,基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型Matlab Simulink仿真效果研究,无人船 无人艇路径跟踪控制 fossen模型matlab simulink效果 基于观测器的LOS制导结合反步法控制 ELOS+backstepping ,无人船; 无人艇; 路径跟踪控制; Fossen模型; Matlab Simulink效果; 基于观测器的LOS制导; 反步法控制; ELOS+backstepping,基于Fossen模型的无人船路径跟踪控制:ELOS与反步法联合控制的Matlab Simulink效果分析
基于【pmsm0512】的MATLAB Simulink永磁同步电机矢量控制策略研究与应用,基于【pmsm0512】的MATLAB Simulink永磁同步电机矢量控制策略研究与应用,【pmsm0512】MATLAB simulink永磁同步电机的矢量控制。 PMSM的矢量控制 ,PMSM; 矢量控制; MATLAB Simulink; 永磁同步电机; 0512,MATLAB Simulink PMSM矢量控制策略研究
深圳绿新威推出的GS2113S 半桥驱动芯片 应用于逆变器驱动 电机驱动等采用高压工艺
PMSM永磁同步电机矢量控制Simulink模型研究:速度环PI与滑模变结构对比,电流环PI滞环策略的建模与实现,PMSM永磁同步电机矢量控制Simulink模型研究:速度环PI与滑模变结构对比分析,电流环PI滞环方案搭建与验证,附详细说明文档及参考资料,PMSM永磁同步电机矢量控制simulink模型,包括matlab模型,两种方案对比,分别为速度环采用pi和滑模变结构对比,电流环采用pi滞环,搭建过程清晰且包含说明文档和其他附带参考资料。 ,PMSM永磁同步电机;矢量控制;Simulink模型;Matlab模型;速度环对比(PI vs 滑模变结构);电流环(PI滞环);搭建过程;说明文档;附带参考资料。,PMSM矢量控制Simulink模型:PI与滑模变结构方案对比
prov year 光缆线路长度/地区面积 安徽 2010 2.852140 4 安徽 2011 3.5921078 安徽 2012 4.3320751 安徽 2013 5.0716782 安徽 2014 5.8315897 安徽 2015 6.9423647 安徽 2016 9.9900103 安徽 2017 12.844298 安徽 2018 15.698587 安徽 20 19 16.412159 安徽 2020 17.125731 安徽 2021 17.839304 安徽 2022 19.266447 北京 2010 6 .5243206 北京 2011 8.9830551 北京 2012 11. 44179 北京 2013 13.407351 北京 2014 14.728 941 北京 2015 16.79026。内容来源于网络分享,如有侵权请联系我删除。
该资源为imutils-0.5.2.tar.gz,欢迎下载使用哦!
Matlab Simulink电机启动模型:模拟电压暂降及电能质量问题,适配IEEE 33节点模型研究,利用Matlab Simulink的电机启动模型精准模拟电压暂降等电能质量问题:适配IEEE 33节点模型,电机启动模型 Matlab simulink 可用于模拟电压暂降等电能质量问题,适配于本家的IEEE 33节点模型。 ,电机启动模型; Matlab Simulink; 电压暂降模拟; 电能质量问题; IEEE 33节点模型; 适配性。,Matlab Simulink电机启动模型:模拟电压暂降电能质量问题的适配IEEE 33节点模型
美赛教程&建模&数据分析&案例分析
台达as系列PLC程序模板:基于现场经验的车企通用模板,含多轴手动与自动流程,地址映像IO,高通用性与扩展性,快速项目实施利器。,台达as系列PLC程序模板:基于现场经验的车企通用模板,含多轴手动与自动流程,灵活高效可移植扩展,台达as系列plc程序模板。 本程序根据多年现场实际经验并参照车企通用模板编写,含6轴手动程序。 1+6(带一分支,可扩分支)自动流程程序。 io采用地址映像。 通用和可扩展性,可移植性强。 非常灵活,可为你项目实施节约大量宝贵时间。 ,台达AS系列PLC; 程序模板; 6轴手动程序; 1+6自动流程程序; IO地址映像; 通用可扩展性; 移植性强; 时间节约。,台达AS系列PLC程序模板:通用可扩展的自动化流程程序
S32系列MCU的S32K144与S32K148 Boot、网络与UDS标定程序定制服务,包含UDS烧写上位机解决方案,S32系列MCU的S32K144与S32K148的boot加载与网络通讯技术——包含UDS烧写及标定程序定制服务,S32k144,S32K148的boot,网络,uds,标定程序订做,包含uds烧写上位机 ,S32k144; S32K148; boot程序订做; 网络功能; UDS烧写; 上位机标定程序,S32系列MCU Boot网络UDS标定程序订制及UDS烧写上位机开发
CAE整车碰撞模型详解:含白车身、底盘等模块,材料曲线公开,细分模块丰富,附碰撞视频资料,CAE整车碰撞模型详解:包含白车身、底盘等多模块,材料及曲线公开,附碰撞视频资料,CAE 整车碰撞模型,模型完整,材料及曲线不加密,内含白车身,底盘,悬架,四门俩盖,前后保,仪表盘等细分模块,另有碰撞视频资料 ,CAE整车碰撞模型;模型完整性;不加密材料;内含细分模块;碰撞视频资料,完整CAE碰撞模型展示:涵盖白车身及底盘悬架等多模块,材料曲线无加密,附带碰撞视频