semaphore和group都是libdispatch提供的基于信号量的同步机制,dispatch_group继承自dispatch_semaphore,使用libdispatch层的信号量算法。dispatch_semaphore维护着一个dsema_value,但它同时聚合了平台的semaphore_t。
dispatch_semaphore聚合了平台提供的semaphore功能,用于同步的等待和唤醒,使用的是系统平台层提供的信号量算法,在下面的依赖图中有表示。
以linux平台为例,semaphore有两个主要的操作分别是up(释放,隐含唤醒)和down(获取,隐含等待)。在libdispatch层,提供了两个对应的扩展物dispatch_semaphore和dispatch_group,它们都依赖着了平台所提供的semaphore机制,在这之上又使用自己的semaphore算法来扩展功能。例如group提供的是full semaphore算法。
dispatch_semaphore的信号量操作分别是signal和wait,而dispatch_group的操作则分别是leave和enter。
dispatch_group的wait并不对信号量操作,但它等待的是full semaphore。dispatch_semaphore的wait则等待并获取有限的信号量资源中的一个信号量。
最后就是notifyqueue,由dsema_notify_head和dsema_notify_tail维护的tailqueue。它的作用在上篇group的工作原理中介绍过。