2013年5月13日

GCD介绍(四): 完结

摘要: Dispatch Queue挂起dispatch queue可以被挂起和恢复。使用dispatch_suspend函数来挂起,使用 dispatch_resume函数来恢复。这两个函数的行为是如你所愿的。另外,这两个函数也可以用于dispatch source。一个要注意的地方是,dispatch queue的挂起是block粒度的。换句话说,挂起一个queue并不会将当前正在执行的block挂起。它会允许当前执行的block执行完毕,然后后续的block不再会被执行,直至queue被恢复。还有一个注意点:从man页上得来的:如果你挂起了一个queue或者source,那么销毁它之前,必须先对 阅读全文

posted @ 2013-05-13 19:10 残月下章台 阅读(133) 评论(0) 推荐(0) 编辑

GCD介绍(三): 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 f 阅读全文

posted @ 2013-05-13 19:09 残月下章台 阅读(181) 评论(0) 推荐(0) 编辑

GCD介绍(二): 多核心的性能

摘要: 概念为了在单一进程中充分发挥多核的优势,我们有必要使用多线程技术(我们没必要去提多进程,这玩意儿和GCD没关系)。在低层,GCD全局 dispatch queue仅仅是工作线程池的抽象。这些队列中的Block一旦可用,就会被dispatch到工作线程中。提交至用户队列的Block最终也会通过全局 队列进入相同的工作线程池(除非你的用户队列的目标是主线程,但是为了提高运行速度,我们绝不会这么干)。有两种途径来通过GCD“榨取”多核心系统的性能:将单一任务或者一组相关任务并发至全局队列中运算;将多个不相关的任务或者关联不紧密的任务并发至用户队列中运算;全局队列设想下面的循环:for(id obj 阅读全文

posted @ 2013-05-13 19:07 残月下章台 阅读(162) 评论(0) 推荐(0) 编辑

GCD介绍(一): 基本概念和Dispatch Queue

摘要: 什么是GCD?Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像 NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之 NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分。除了代码的平行执行能力,GCD还提供高度集成的事件控制系统。可以设置句柄来响应文件描述符、mach ports(Mach port用于 OS X上的进程间通讯)、进程、计时器、信号、用户生成事件。这些句柄通过GCD来并发执行。GCD的API 阅读全文

posted @ 2013-05-13 19:04 残月下章台 阅读(182) 评论(0) 推荐(0) 编辑

Mechanical Sympathy

摘要: Memory Barriers/FencesIn this article I'll discuss the most fundamental technique in concurrent programming known as memory barriers, or fences, that make the memory state within a processor visible to other processors.CPUs have employed many techniques to try and accommodate the fact that CPU e 阅读全文

posted @ 2013-05-13 17:38 残月下章台 阅读(185) 评论(0) 推荐(0) 编辑

GCC 提供的原子操作

摘要: gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。其声明如下:type__sync_fetch_and_add(type*ptr,typevalue,...)type__sync_fetch_and_sub(type*ptr,typevalue,...)type__sync_fetch_and_or(type*ptr,typevalue,...)type__sync_fetch_and_and(type*ptr,typevalue,...)type__sync_fetch_and_xor(type*ptr,typevalue,...)type 阅读全文

posted @ 2013-05-13 16:51 残月下章台 阅读(210) 评论(0) 推荐(0) 编辑

导航