GCD多线程的使用(二)

记录一下GCD的几个重要API的用法。

dispatch_queue_create

 * @param label
 * A string label to attach to the queue.
 * This parameter is optional and may be NULL.
 *
 * @param attr
 * DISPATCH_QUEUE_SERIAL or DISPATCH_QUEUE_CONCURRENT.
 *
 * @result
 * The newly created dispatch queue.
dispatch_queue_t
dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

用来创建Dispatch Queue,返回值类型是dispatch_queue_t,这个方法需要传递两个参数,label是附加到queue上的一个字符串标签,这个参数是可选的,并且有可能为空,这是queue的名字,在进行调试的时候会很方便,所以推荐在创建Dispatch Queue的时候传一个标签。获取一个queue的名字的方法如下:

/*!
 * @function dispatch_queue_get_label
 *
 * @abstract
 * Returns the label of the given queue, as specified when the queue was
 * created, or the empty string if a NULL label was specified.
 *
 * Passing DISPATCH_CURRENT_QUEUE_LABEL will return the label of the current
 * queue.
 *
 * @param queue
 * The queue to query, or DISPATCH_CURRENT_QUEUE_LABEL.
 *
 * @result
 * The label of the queue.
 */
const char *
dispatch_queue_get_label(dispatch_queue_t queue);

第二个参数attr是用来指定创建的Dispatch Queue的类型,DISPATCH_QUEUE_SERIAL或者NULL表示创建串行Dispatch Queue,DISPATCH_QUEUE_CONCURRENT表示创建并行Dispatch Queue。其实创建串行的参数DISPATCH_QUEUE_SERIAL就是NULL,源码如下:

/*!
 * @const DISPATCH_QUEUE_SERIAL
 * @discussion A dispatch queue that invokes blocks serially in FIFO order.
 */
#define DISPATCH_QUEUE_SERIAL NULL

   FIFO,即First in first out,先进先出。

关于创建的两种Dispatch Queue类型,Serial Dispatch Queue同时只能执行一个追加处理,Concurrent Dispatch Queue能并行追加多个处理,虽然这两种Dispatch Queue受到系统资源的限制,但用dispatch_queue_create函数可以生成任意多个Dispatch Queue。当生成多个Serial Dispatch Queue时,各个Serial Dispatch Queue并行执行,虽然在一个Serial Dispatch Queue中同时只能执行一个追加处理,但如果将处理分别追加到4个Serial Dispatch Queue中,各个Serial Dispatch Queue执行一个,即同时执行4个处理。也就是一旦生成Serial Dispatch Queue并进行追加处理,系统就要对这个Serial Dispatch Queue生成且只生成一个线程,如果生成多个Serial Dispatch Queue,那么系统就生成多个线程。

虽然能生成多个线程,但是决不能滥用Serial Dispatch Queue,因为如果过多的使用线程,会消耗大量的内存,引起大量的上下文切换,大幅度降低系统的响应性能。所以建议只在为了避免多个线程更新相同资源导致数据竞争时使用Serial Dispatch Queue。

当想并行执行不发生数据竞争问题的处理时,使用Concurrent Dispatch Queue,对于Concurrent Dispatch Queue来说,不管生成多少,由于XNU内核只使用有效管理的线程,因此不会发生Serial Dispatch Queue的那些问题。

另外,通过diaptch_queue_create函数生成的Dispatch Queue在使用结束后需要通过dispatch_release函数来释放。

dispatch_release(queue);

相对应的,GCD也有retain操作,dispatch_retain函数就是增加引用计数的。GCD中得Dispatch Queue也像Objectiv-C的引用技术式内存管理一样,需要通过dispatch_retain和dispatch_release的引用计数来管理内存。

最后推荐一个非常好的博客:唐巧的技术博客

时间: 2024-11-06 07:15:07

GCD多线程的使用(二)的相关文章

Android多线程分析之二:Thread的实现

Android多线程分析之二:Thread 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分析之一:使用Thread异步下载图像>中演示了如何使用 Thread 处理异步事务.示例中这个 Java Thread 类都是位于 Framework 层的类,它自身是通过 JNI 转调 dalvik 里面的 Thread 相关方法实现的.因此要分析 Androd 中的线程,就需要分析这两层中的与线程相关的代码,这就是本文要

iOS开发中的gcd多线程tips

iOS开发中的gcd多线程tips 我们经常用到的: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 处理耗时操作的代码块 //通知主线程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新 }); }); 其中main_queue是系统默认的串行队列,global_queue是系统默认的并行队列. 什么是串行队列(Serial)? 创建任意个数的串行队列,每个队

多线程开发之二 NSOperation

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UITableViewController 4 @property (strong, nonatomic) NSArray *arrSampleName; 5 6 - (instancetype)initWithSampleNameArray:(NSArray *)arrSampleName; 7 8 @end  ViewContro

Android多线程——Handler (二)

传递消息的集中方式: 一: Message message = Message.obtain(); message.obj = data; message.what = IS_FINISHED; handle.sendMessage(message); 二: Message message = Message.obtain(handle); message.obj = data; message.sendToTarget(); 三:可以在message中传递复杂数据 Message messag

Java多线程基础(二)定时器类:Timer类和TimerTask类

Java多线程基础(二)定时器类:Timer类和TimerTask类 Timer类和TimerTask类是jdk实现定时器功能的早期方法,jdk1.5以前就支持Timer类和TimerTask类.JDK1.5之后引入了新的机制,将在后续博文中研究. 1 指定时间间隔后执行任务 import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TraditionalTimerTest {

iOS开发之GCD 多线程 1.串行队列 2.并行队列 3.分组 4.信号量 详细讲解

GCD多线程下,实现线程同步的方式有如下几种: 1.串行队列 2.并行队列 3.分组 4.信号量 实例: 去网上获取一张图片并展示在视图上. 实现这个需求,可以拆分成两个任务,一个是去网上获取图片,一个是展示在视图上. 这两个任务是有关联的,所以需要同步处理. 下面看这几种方式如何实现. 一. 1.串行队列 1.1[GCD相关:] (1)GCD下的dispatch_queue队列都是FIFO队列,都会按照提交到队列的顺序执行. 只是根据队列的性质,分为<1>串行队列:用户队列.主线程队列 &l

进行概念详解 多线程上篇(二)

操作系统是程序与硬件交互的中间层,现代操作系统将程序的一次执行抽象为进程和线程的概念. 进程作为资源分配的基本单位,线程作为执行的基本单位. 进程和线程其实就是操作系统程序本身实现控制一个程序运行的数据项描述 所有的程序都是面向语言进行开发的,而语言本身是面向操作系统的,线程是操作系统对程序一次运行的抽象 所以,所有的多线程编程模型,必然遵从操作系统的大逻辑,必然是符合操作系统的对线程的抽象概念,操作系统在抽象之上提供了API供应用程序调用 简言之,应用程序的底层是借助于操作系统来完成多线程编程

IOS - 总结下swift使用GCD 多线程(二)GCD和DispatchQueue

1.前言  iOS中处理多核并发的技术有两种分别是:`Grand Central Dispatch`(以下简称`GCD`)和`NSOperationQueue`框架.iOS开发的老司机们在程序开发中处理多个任务同时执行的时候,一定都会使用到这两个框架,而且GCD依靠它简洁的语法和对block的运用一直很受大家的青睐.ios开发中你一定明白 这样一条原则:"任何用于界面ui刷新和用户交互的操作都要放在主线程来操作,任何耗时或者耗CPU的任务必须在异步线程去操作*",----小白都会问为什

GCD多线程综合

//回到主线程 为了线程安全 刷新UI 不推荐使用 image 是需要传递的图片 //第一种  YES 参数是等待图片加载完成 再执行后面的方法 [self performSelectorOnMainThread:@selector(createThread) withObject:image waitUntilDone:YES]; //第二种 [self performSelector:@selector(createThread) onThread:[NSThread mainThread]