博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Grad Central Dispatch
阅读量:4115 次
发布时间:2019-05-25

本文共 3555 字,大约阅读时间需要 11 分钟。

GCD 概述

1. GCD 包含于 libSystem.dylib

2. 可供所有程序使用.

- #include <dispatch/dispatch.h>

3. GCD API 提供 block-based and function-based variants

- 目前仅提供 block-based API

GCD总结

1. Blocks

- dispatch_async()

2. Queues

- Lightweight list of blocks

- Enqueue/dequeue is FIFO

3. dispatch_get_main_queue()

- Main thread/main runloop

4. dispatch_queue_create()

- Automatic helper thread

GCD的好处

1. 高效 - More CPU cycles available for your code

2. 使用方便

- Blocks are easy to use

- Queues are inherently producer/consumer

3. Systemwide perspective

- Only the OS can balance unrelated subsystems

兼容性

1. Existing threading and synchronization primitives are 100% compatible

2. GCD threads are wrapped POSIX threads

- Do not cancel, exit, kill, join, or detach GCD threads

3. GCD reuses threads

- Restore any per-thread state changed within a block

多线程

Session 206已提到此内容。

锁定资源

1. 对关键资源进行互斥访问。

2. 在线程中按序访问共享资源。

3. Ensure data integrity

没有GCD的代码

- (void)updateImageCacheWithImg:(UIImage*)img {

NSLock *l = self.imageCacheLock;

[l lock];

// Critical section

if ([self.imageCache containsObj:img]) {

[l unlock]; // Don't forget to unlock

return;

}

[self.imageCache addObj:img];

[l unlock];

}

GCD代码

- (void)updateImageCacheWithImg:(NSImage*)img {

dispatch_queue_t queue = self.imageCacheQueue;

dispatch_sync(queue, ^{ //You can change dispatch_sync to dispatch_async to defer critical section

// Critical section

if ([self.imageCache containsObj:img]) {

return;

}

[self.imageCache addObj:img];

});

}

线程间通信

通过以下方法 (Without GCD)

– performSelectorOnMainThread:withObject:waitUntilDone:

– performSelector:onThread:withObject:waitUntilDone:

– performSelector:withObject:afterDelay:

– performSelectorInBackground:withObject:

GCD 代码,等同于 performSelector:onThread:withObject:waitUntilDone:

// waitUntilDone: NO

dispatch_async(queue, ^{

[myObject doSomething:foo withData:bar];

});

// waitUntilDone: YES

dispatch_sync(queue, ^{

[myObject doSomething:foo withData:bar];

});

GCD代码, 等同于 performSelector:withObject:afterDelay:dispatch_time_t delay;delay = dispatch_time(DISPATCH_TIME_NOW, 50000 /* 50μs */);dispatch_after(delay, queue, ^{ [myObject doSomething:foo withData:bar];});GCD代码,等同于 performSelectorInBackground:withObject:dispatch_queue_t queue = dispatch_get_global_queue(0, 0);dispatch_async(queue, ^{ [myObject doSomething:foo withData:bar];});

Global Queues1. Enqueue/dequeue is FIFO

GCD queue 1

2. Concurrent execution- Non-FIFO completion order

GCD queue 2

3. dispatch_get_global_queue(priority, 0)

4. Global queues map GCD activity to real threads 5. Priority bands- DISPATCH_QUEUE_PRIORITY_HIGH - DISPATCH_QUEUE_PRIORITY_DEFAULT - DISPATCH_QUEUE_PRIORITY_LOW
下面三节讲述了很多内容,但我还没有理解。如有兴趣,请看原始视频。- Dispatch Sources
- Source Cancellation- Target Queues
GCD对象

GCD方法大全

GCD functions

管理对象的生命周期

1. Ensure objects captured by blocks are valid when blocks are executed

- Objects must be retained and released around asynchronous operations

2. Objective-C objects captured by blocks are auto-retained and auto-released

3. Other objects captured by blocks must be retained by your code

- CFRetain()/CFRelease()

- dispatch_retain()/dispatch_release()

挂起和恢复

1. Suspend and resume only affects queues and sources you create

- Sources are created suspended

2. Suspension is asynchronous

- Takes effect between blocks

3. Your queues can predictably suspend objects that target them

程序上下文

1. Applications can attach custom data to GCD objects

- dispatch_set_context()/dispatch_get_context()

2. Optional finalizer callback

- dispatch_set_finalizer_f()

- Allows attached context to be freed with object

- Called on the target queue of the object

转载地址:http://nrwpi.baihongyu.com/

你可能感兴趣的文章
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
Linux的SOCKET编程 简单演示
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux C++线程池实例
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>
Linux网络编程---I/O复用模型之poll
查看>>
Java NIO详解
查看>>
在JS中 onclick="save();return false;"return false是
查看>>
idea 有时提示找不到类或者符号
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
MFC矩阵运算
查看>>