在GCD中,处理并发控制主要是使用一个串行队列
dispatch_queue_t,先进先出的原则,保证队列的正常进行。
但在某一个时刻,可能会有多个block并发执行,我们的主线程就需要不断轮去查询一知晓block是否执行完毕,但这样做的效率是很低的,浪费CPU资源,因此我们使用通信机制去解决这个问题:semaphore信号量。它的原理很简单,生产消费模式,必须生产才能消费,没有资源的时候我什么也不干,直到资源就绪。
-(void)prepare
{
__block
int sum=0;
//资源数小于0,表示资源不可得
__block dispatch_semaphore_t
_sem1=dispatch_semaphore_create(0);
__block dispatch_semaphore_t
_sem2=dispatch_semaphore_create(0);
dispatch_block_t task1=^{
int s = sum;
for (int i = 0; i < 2; i++)
s += 1;
sum = s;
NSLog(@" >> after task1: %d", sum);
dispatch_semaphore_signal(_sem1);
};
dispatch_block_t task2=^{
//等待第一个信号量
dispatch_semaphore_wait(_sem1,
DISPATCH_TIME_FOREVER);
int s = sum;
for (int i = 0; i < 3; i++)
s += 3;
sum =
s;
NSLog(@" >> after task2: %d", sum);
dispatch_semaphore_signal(_sem2);
};
dispatch_async(_serialqueue, task1);
dispatch_async(_serialqueue, task2);
//等待第二个信号量,直到资源准备就绪
dispatch_semaphore_wait(_sem2,
DISPATCH_TIME_FOREVER);
dispatch_release(_sem1);
dispatch_release(_sem2);
}