当前位置: 首页 > news >正文

北京丰台网站建设长沙网站制作工作室

北京丰台网站建设,长沙网站制作工作室,外贸公司介绍范文,236企业邮箱登录入口一、Dispatch Queue挂起dispatch queue可以被挂起和恢复。使用 dispatch_suspend函数来挂起#xff0c;使用 dispatch_resume 函数来恢复。这两个函数的行为是如你所愿的。另外#xff0c;这两个还是也可以用于dispatch source。一个要注意的地方是#xff0c;dispatch que… 一、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 调用之前被执行但它不会强制每次调用这个函数都让代码进行同步控制。实际上如果你去看这个函数所在的头文件你会发现目前它的实现其实是一个宏进行了内联的初始化测试这意味着通常情况下你不用付出函数调用的负载代价并且会有更少的同步控制负载。 转载自http://www.dreamingwish.com/dream-2012/gcd-four-the-the-odds-and-ends.html
http://wiki.neutronadmin.com/news/293971/

相关文章:

  • 淄博高端网站建设公司phpmysql网站开发笔记
  • 页面简单的网站网站基础建设
  • 湖南高端网站建设郑州注册公司代理记账
  • 谁帮58同城做的网站深圳正规网站建设
  • 网站建设论文答辩ppt哪些网站做推广好
  • 策划 网站最近的时事新闻
  • 无锡所有网站设计制作企业信用查询平台
  • 商城微网站创建安阳网站建设哪家便宜
  • 内江住房和城乡建设厅网站移动端开发工具
  • 罗湖网站制作多少钱WordPress修改网站背景
  • 外贸行业网站建设公司管理咨询公司企业文化
  • 学做招投标的网站有哪些淘客网站建设
  • 上海金山网站设计公司泰安网站建设 九微米
  • wap网站网站设计的提案
  • 山东网站排名优化公司中国建设工程协会网站电话
  • 福建建筑人才服务中心档案wordpress插件带seo
  • 网站在线制作wordpress 标签手册
  • 青海市建设局网站东莞企业网站制作推广运营
  • 注册网站要多少钱7zwd一起做网店官网
  • 金坛市住房和城乡建设局网站做的网站没给我备案
  • 网站开发常用数据库主流网站开发技术
  • 以网络营销为导向的网站建设应注意什么问题wordpress问答悬赏插件
  • 帮别人做违法网站会判刑吗做网站程序
  • 昆明做网站建设网站建设网站制作哪个好
  • 国内好的企业网站唐山乾正建设工程材料检测公司网站
  • 网站建设 的销售图片网站建设新闻 常识
  • 郑州网站建设贝斯特做外贸电商网站有哪个
  • 网站建设中是因为没有ftp上传吗手机派网站
  • 滴滴出行网站建设wordpress本地播放器
  • 网站空间计算wordpress适应大数据