GCD教程(二):多核心的性能(上)
来源:互联网 发布:超强手机振动器软件 编辑:程序博客网 时间:2024/05/16 06:15
概念
为了在单一进程中充分发挥多核的优势,我们有必要使用多线程技术(我们没必要去提多进程,这玩意儿和GCD没关系)。在低层,GCD全局dispatch queue仅仅是工作线程池的抽象。这些队列中的Block一旦可用,就会被dispatch到工作线程中。提交至用户队列的Block最终也会通过全局队列进入相同的工作线程池(除非你的用户队列的目标是主线程,但是为了提高运行速度,我们绝不会这么干)。
有两种途径来通过GCD“榨取”多核心系统的性能:将单一任务或者一组相关任务并发至全局队列中运算;将多个不相关的任务或者关联不紧密的任务并发至用户队列中运算;
全局队列
设想下面的循环:
for
(
id
obj in array)
[
self
doSomethingIntensiveWith
:obj];
假定 -doSomethingIntensiveWith
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0
);
for
(
id
obj in array)
dispatch_async(queue,^{
[
self
doSomethingIntensiveWith
:obj];
});
如此简单,我们已经在多核心上运行这段代码了。
当然这段代码并不完美。有时候我们有一段代码要像这样操作一个数组,但是在操作完成后,我们还需要对操作结果进行其他操作:
for
(
id
obj in array)
[
self
doSomethingIntensiveWith
:obj];
[
self
doSomethingWith
:array];
这时候使用GCD的 dispatch_async
dispatch_sync来解决这个问题
,
解决这个问题的一种方法是使用dispatch group。一个dispatch group可以用来将多个block组成一组以监测这些Block全部完成或者等待全部完成时发出的消息。使用函数dispatch_group_create来创建,然后使用函数dispatch_group_async来将block提交至一个dispatch queue,同时将它们添加至一个组。所以我们现在可以重新代码:
dispatch_queue_t queue =dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0
);
dispatch_group_t group = dispatch_group_create();
for
(
id
obj in array)
dispatch_group_async(group,queue, ^{
[
self
doSomethingIntensiveWith
:obj];
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(group);
[
self
doSomethingWith
:array];
如果这些工作可以异步执行,那么我们可以更风骚一点,将函数-doSomethingWith:放在后台执行。我们使用dispatch_group_async函数建立一个block在组完成后执行:
dispatch_queue_t queue =dispatch_get_global_qeueue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0
);
dispatch_group_t group = dispatch_group_create();
for
(
id
obj in array)
dispatch_group_async(group,queue, ^{
[
self
doSomethingIntensiveWith
:obj];
});
dispatch_group_notify(group, queue, ^{
[
self
doSomethingWith
:array];
});
dispatch_release(group);
不仅所有数组元素都会被平行操作,后续的操作也会异步执行,并且这些异步运算都会将程序的其他部分考虑在内。注意如果-doSomethingWith:需要在主线程中执行,比如操作GUI,那么我们只要将main queue而非全局队列传给dispatch_group_notify函数就行了。
- GCD教程(二):多核心的性能(上)
- GCD教程(二):多核心的性能(上)
- GCD教程(二):多核心的性能(下)
- GCD教程(二):多核心的性能(下)
- GCD教程(二):多核心的性能
- GCD教程(二):多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- GCD介绍(二): 多核心的性能
- 获取web应用的绝对路径
- Oracle中的序列,同义词
- C#中的线程 入门
- 十大编程算法助程序员走上高手之路
- JavaScript中实现继承的几种方式
- GCD教程(二):多核心的性能(上)
- hadoop2.2完全分布式最新高可靠安装文档
- js中的cookie
- 【学习手记】U3D实战之DontTouchWhite(二)
- GCD教程(二):多核心的性能(下)
- 配置
- R语言: 去掉某些高级绘图函数已经包含了默认的标题和标签
- Windows下C语言命令行编译器的环境变量设置
- zend1/2适用的重写配置(apache,nginx,iis6/7,iirf)