Concurrency Programming Guide 1 Glossary
术语表
application
我们常说的APP,包含用户互交界面的应用程序
asynchronous design approach
异步设计方法
asynchonous是指让代码跑在别的线程上,而不是发起的线程上。使用多核处理器资源来提高程序的运行效率。
block object
一种C结构体,包含了代码和相关数据。使用block可以很方便的把一段包含数据的代码交给其他线程执行。关于block的具体介绍见 Block Programing Guide
concurrent operation
并发执行任务类。在调用其start方法之后,它会自己创建一个线程来执行自己的任务。
condition
用来同步临界资源的访问权限的程序结构(原句:A construct used to synchronize access to a resource)。如果一个线程等待某个正在被别的进程只用的临界资源,它将会被阻塞到这个临界资源可以被访问为止。
critical section
临界资源,一个时间只允许被一个线程访问的代码段
custom source
自定义的应用程序事件。由dispatch source处理。
descriptor
用来访问文件、socket或其他系统资源的抽象标识符。
dispatch queue
一种 Grand Central Diaptch 程序结构。用来串行或并行的执行任务。
dispatch source
Grand Central Diaptch 中用来处理系统事件的数据结构
descriptor dispatch source
用来处理文件相关的事件的dispatch source。当一个文件发生变动(可读写状态/其他文件相关的属性变动)时将会触发你自定义的事件。
dynamic shared libary
动态加载库
framework
包含动态加载库和对应的头文件。见 framework programing guide
global dispatch queue
GCD 提供的全局任务执行队列,不需要自己创建,直接使用函数获取使用就可以。
Grand Central Dispatch(GCD)
一种用来异步并发程序的技术。
input source
线程异步事件的输入源,基于端口/手动触发。必须要绑定到线程的run loop。
detached thread
执行完之后会自动释放资源的线程。
joinable thread
执行完之后不会马上释放资源的线程。使用pthread_join(tid)会挂起父线程,直至子线程完成才可以执行后面的代码。
关于detached和joinable这里有一个非常棒的解释
A thread can be detached by using
pthread_detach()
read the man page... If you create the thread in the detached state, then you won't need to runpthread_join()
orpthread_detach()
.
The main difference between a detached thread an a joinable thread is that you don't need to join (pthread_join
) the thread to release its storage resources afterpthread_exit()
has been called. Of course you can also callpthread_detach()
instead ofpthread_join()
but you won't have access to the exit status.
Read the man pages forpthread_detach()
,pthread_create()
,pthread_attr_setdetachstate()
for more information.
Do you know what a thread is? Read this: Thread article.
If you are wondering why not usepthread_join()
instead ofpthread_detach()
and just not look at the exit status, well, the answer is thatpthread_join()
will wait for the thread to finish if it hasn't already, thus blocking the calling thread until the other one finishes.pthread_detach()
is like saying: "I don't care about this thread anymore, so when it dies (if it hasn't already) please send the exist status to the trash can... I won't be waiting for that to happen..."1
library
一个用来监听底层系统事件的UNIX特性。见kqueue
Mach port dispatch source
一个用来处理Mach port事件的dispatch source
在苹果的Thread Programming Guide的Run Pool一节的Configuring a Port-Based Input Source 这一段中就有使用Mach Port进行线程间通信的例子。 其实质就是父线程创建一个NSMachPort对象,在创建子线程的时候以参数的方式将其传递给子线程,这样子线程中就可以向这个传过来的 NSMachPort对象发送消息,如果想让父线程也可以向子线程发消息的话,那么子线程可以先向父线程发个特殊的消息,传过来的是自己创建的另一个 NSMachPort对象,这样父线程便持有了子线程创建的port对象了,可以向这个子线程的port对象发送消息了。
当然各自的port对象需要设置delegate以及schdule到自己所在线程的RunLoop中,这样来了消息之后,处理port消息的delegate方法会被调用,你就可以自己处理消息了。2
main thread
APP的启动时自动创建的主线程
mutex
互斥锁
recursive lock/mutex
递归式互斥锁
递归锁,这个锁可以被同一线程多次请求,而不会引起死锁。这主要是用在循环或递归操作中。3
open Computing Language(OpenCL)
使用GPU做并行计算的技术4
operation object
NSOperation的实例。operation会封装任务相关的代码和数据,使之变成一个可独立执行的单元。
operation queue
NSOperationQueue的实例。管理其中operation的执行。
private dipatch queue
自己创建/管理/释放的dispatch queue
process
应用程序进程(原:The runtime instance of an application or program.)。runtime管理该应用程序的虚拟内存和其他分配的系统资源。包含一个以上的线程。
process dispatch source
用来处理进程相关事件的dispatch source
program
和application的关系大概如下:
reentrant
可重入代码,可以同时在多个线程中安全运行。
run loop
一个线程中根据接收的事件来作分发的循环代码
run loop mode
在Cocoa中,每个线程(NSThread)对象中内部都有一个run loop(NSRunLoop)对象用来循环处理输入事件,处理的事件包括两类,一是来自Input sources的异步事件,一是来自Timer sources的同步事件;
run Loop在处理输入事件时会产生通知,可以通过Core Foundation向线程中添加run-loop observers来监听特定事件,以在监听的事件发生时做附加的处理工作。
每个run loop可运行在不同的模式下,一个run loop mode是一个集合,其中包含其监听的若干输入事件源,定时器,以及在事件发生时需要通知的run loop observers。运行在一种mode下的run loop只会处理其run loop mode中包含的输入源事件,定时器事件,以及通知run loop mode中包含的observers。
run loop object
NSRunLoop/CFRunLoopRef实例,提供线程实现循环处理事件接口。
run loop observer
监听结果的接收者
semaphore
信号量。它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
也是操作系统中用于控制进程同步互斥的量。6
signal
sig是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。7
signal dispatch source
用来处理UNIX signal的dispatch source
task
需要执行的作业
thread
进程中一个程序流(线程)
timer dispatch source
处理timer事件的dispatch source
Serial vs. Concurrent 串行 vs. 并发
这些术语描述当任务相对于其它任务被执行,任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行。
Synchronous vs. Asynchronous 同步 vs. 异步
在 GCD 中,这些术语描述当一个函数相对于另一个任务完成,此任务是该函数要求 GCD 执行的。一个同步函数只在完成了它预定的任务后才返回。
一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成。因此,一个异步函数不会阻塞当前线程去执行下一个函数。
Critical Section 临界区
就是一段代码不能被并发执行,也就是,两个线程不能同时执行这段代码。这很常见,因为代码去操作一个共享资源,例如一个变量若能被并发进程访问,那么它很可能会变质(译者注:它的值不再可信)。
Race Condition 竞态条件
这种状况是指基于特定序列或时机的事件的软件系统以不受控制的方式运行的行为,例如程序的并发任务执行的确切顺序。竞态条件可导致无法预测的行为,而不能通过代码检查立即发现。
Deadlock 死锁
两个(有时更多)东西——在大多数情况下,是线程——所谓的死锁是指它们都卡住了,并等待对方完成或执行其它操作。第一个不能完成是因为它在等待第二个的完成。但第二个也不能完成,因为它在等待第一个的完成。
Thread Safe 线程安全
线程安全的代码能在多线程或并发任务中被安全的调用,而不会导致任何问题(数据损坏,崩溃,等)。线程不安全的代码在某个时刻只能在一个上下文中运行。一个线程安全代码的例子是 NSDictionary 。你可以在同一时间在多个线程中使用它而不会有问题。另一方面,NSMutableDictionary 就不是线程安全的,应该保证一次只能有一个线程访问它。
Context Switch 上下文切换
一个上下文切换指当你在单个进程里切换执行不同的线程时存储与恢复执行状态的过程。这个过程在编写多任务应用时很普遍,但会带来一些额外的开销。
Concurrency vs Parallelism 并发与并行
并发和并行通常被一起提到,所以值得花些时间解释它们之间的区别。
并发代码的不同部分可以“同步”执行。然而,该怎样发生或是否发生都取决于系统。多核设备通过并行来同时执行多个线程;然而,为了使单核设备也能实现这一点,它们必须先运行一个线程,执行一个上下文切换,然后运行另一个线程或进程。这通常发生地足够快以致给我们并发执行地错觉,如下图所示:
虽然你可以编写代码在 GCD 下并发执行,但 GCD 会决定有多少并行的需求。并行要求并发,但并发并不能保证并行。8