手机端网站开发流程图wordpress安装到虚机
web/
2025/10/3 4:41:02/
文章来源:
手机端网站开发流程图,wordpress安装到虚机,嵌入式培训机构排名,图片模板免费下载一、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://www.mzph.cn/web/86019.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!