标签为 "多线程" 的存档

iOS系统GCD学习(12):IO资源竞争

概述

  我将分四步来带大家研究研究程序的并发计算。第一步是基本的串行程序,然后使用GCD把它并行计算化。如果你想顺着步骤来尝试这些程序的话,可以下载源码。注意,别运行imagegcd2.m,这是个反面教材。。

原始程序

  我们的程序只是简单地遍历~/Pictures然后生成缩略图。这个程序是个命令行程序,没有图形界面(尽管是使用Cocoa开发库的),主函数如下: 阅读更多…

iOS系统GCD学习(11):使用串行队列实现简单的预加载

  其主要思路是使用gcd创建串行队列,然后在此队列中先后执行两个任务:
  1.预加载一个viewController
  2.将这个viewController推入
  代码如下: 阅读更多…

iOS系统GCD学习(10):常见的错误

  贴几段斯坦福大学关于gcd的代码,这段代码逐步演示了如何修正错误,其中用到的既是串行队列。
  1。这个是原始代码

- (void)viewWillAppear:(BOOL)animated
{
    NSData *imageData = [FlickrFetcher imageDataForPhotoWithURLString:photo.URL];
    UIImage *image = [UIImage imageWithData:imageData];
    self.imageView.image = image;
    self.imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height);
    self.scrollView.contentSize = image.size;
}

阅读更多…

iOS系统GCD学习(9):多核心的性能

概念

  为了在单一进程中充分发挥多核的优势,我们有必要使用多线程技术(我们没必要去提多进程,这玩意儿和GCD没关系)。在低层,GCD全局dispatch queue仅仅是工作线程池的抽象。这些队列中的Block一旦可用,就会被dispatch到工作线程中。提交至用户队列的Block最终也会通过全局队列进入相同的工作线程池(除非你的用户队列的目标是主线程,但是为了提高运行速度,我们绝不会这么干)。 阅读更多…

iOS系统GCD学习(8):Dispatch Queue挂起恢复和目标指定

Dispatch Queue挂起恢复

  dispatch queue可以被挂起和恢复。使用 dispatch_suspend函数来挂起,使用 dispatch_resume 函数来恢复。这两个函数的行为是如你所愿的。另外,这两个还是也可以用于dispatch source。
  一个要注意的地方是,dispatch queue的挂起是block粒度的。换句话说,挂起一个queue并不会将当前正在执行的block挂起。它会允许当前执行的block执行完毕,然后后续的block不再会被执行,直至queue被恢复。 阅读更多…

iOS系统GCD学习(7):dispatch_once

  GCD还提供单次初始化支持,这个与pthread中的函数 pthread_once 很相似。GCD提供的方式的优点在于它使用block而非函数指针,这就允许更自然的代码方式。
  这个特性的主要用途是惰性单例初始化或者其他的线程安全数据共享。典型的单例初始化技术看起来像这样(线程安全的): 阅读更多…

iOS系统GCD学习(6):Dispatch Sources

何为Dispatch Sources

  简单来说,dispatch source是一个监视某些类型事件的对象。当这些事件发生时,它自动将一个block放入一个dispatch queue的执行例程中。说的貌似有点不清不楚。我们到底讨论哪些事件类型?
  下面是GCD 10.6.0版本支持的事件:

Mach port send right state changes. 
Mach port receive right state changes. 
External process state change. 
File descriptor ready for read. 
File descriptor ready for write. 
Filesystem node event. 
POSIX signal. 
Custom timer. 
Custom event. 

阅读更多…

iOS系统GCD学习(5):信号量机制

  当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。 阅读更多…

iOS系统GCD学习(4):dispatch_group2

dispatch_apply的使用

  对于同步执行,GCD提供了一个简化方法叫做dispatch_apply。这个函数调用单一block多次,并平行运算,然后等待所有运算结束,就像我们想要的那样:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply([array count], queue, ^(size_t index){
        [self doSomethingIntensiveWith:[array objectAtIndex:index]];
    });
    [self doSomethingWith:array];

阅读更多…

iOS系统GCD学习(3):dispatch_group

  设想下面的循环:

    for(id obj in array)
        [self doSomethingIntensiveWith:obj];

  假定 -doSomethingIntensiveWith: 是线程安全的且可以同时执行多个.一个array通常包含多个元素,这样的话,我们可以很简单地使用GCD来平行运算: 阅读更多…