Dispatch信号量
很多程序设计都设计到信号量,生产者-消费者模型在多线程编程中会频繁的使用。GCD提供了自己的一套信号量机制。
1.dispatch_semaphore_t sema = dispatch_semaphore_create(RESOURCE_SIZE);
2.dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
3.//do some work here.
4.dispatch_semaphore_signal(sema);
dispatch_semaphore_wait用来获取信号量,若信号量为0,则等待直到信号量大于0。在处理任务结束后,应释放相关资源并调用dispatch_semaphore_signal使信号量增加1个。
实例:
// 创建一个信号量,值为0
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
// 在一个操作结束后发信号,这会使得信号量+1
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
dispatch_semaphore_signal(sema);
});
// 一开始执行到这里信号量为0,线程被阻塞,直到上述操作完成使信号量+1,线程解除阻塞
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);