dispatch_semaphore_t这个是使用GCD帮我们进行控制加解锁控制的方式,当资源很紧张的时候,就要可以使用的,但是也是可以使用锁控制的,这个看个人习惯。首先,看看这个dispatch_semaphore_t的创建,降低信号量,增加信号量。
dispatch_semaphore_create//创建信号量,传入的值必须大于等于0,不然会返回NULL。
dispatch_semaphore_wait//等待信号量,减少信号量的值。
dispatch_semaphore_signal//增加信号量的值。
下面就使用demo讲解一下:
@interface dispatchSemaphore()
{
dispatch_semaphore_t semaphore;
}
@end
@implementationdispatchSemaphore
- (instancetype)init{
self= [superinit];
if(self) {
semaphore = dispatch_semaphore_create(0);
[self createThread];
}
return self;
}
- (void)createThread{
dispatch_semaphore_signal(semaphore);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"queue1--begin");
sleep(1);
NSLog(@"queue1--end");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"queue2--begin");
sleep(1);
NSLog(@"queue2--end");
dispatch_semaphore_signal(semaphore);
});
dispatch_async(queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"queue3--begin");
sleep(1);
NSLog(@"queue3--end");
dispatch_semaphore_signal(semaphore);
});
}
当dispatch_semaphore_create(0)的时候,此时一直处于等待状态,必须dispatch_semaphore_signal(semaphore);后,才能执行下面的状态,执行的顺序是依次执行。
当dispatch_semaphore_create(1)的时候,就不需要dispatch_semaphore_signal(semaphore);然后就是顺序依次执行。
当dispatch_semaphore_create(2)的时候,就先执行1和2两个任务,当1执行完后,正好3进入GCD中,相当于一个队列,1号出队列,3号入队列,继续执行2,然后执行3。
当dispatch_semaphore_create(3)的时候,就是并发执行,执行顺序:
2018-06-13 16:35:56.024268+0800 RunTime[4440:206226] queue2--begin
2018-06-13 16:35:56.024268+0800 RunTime[4440:206225] queue1--begin
2018-06-13 16:35:56.024268+0800 RunTime[4440:206227] queue3--begin
2018-06-13 16:35:57.024913+0800 RunTime[4440:206226] queue2--end
2018-06-13 16:35:57.024915+0800 RunTime[4440:206225] queue1--end
2018-06-13 16:35:57.024927+0800 RunTime[4440:206227] queue3--end
顺序不是依次执行的。
dispatch_semaphore_wait中第二个参数,可以是DISPATCH_TIME_FOREVER或者DISPATCH_TIME_NOW。
DISPATCH_TIME_NOW//当前
DISPATCH_TIME_FOREVER//未来
也可以使用dispatch_time函数进行创建,例如:dispatch_time(DISPATCH_TIME_NOW, 50*NSEC_PER_MSEC)
注意:主要控制dispatch_semaphore_create中数字,才能进行进行是否并发。
当创建dispatch_semaphore_create中数字大于0的时候,在创建完成后,dispatch_semaphore_signal(semaphore);调用后,也会进行并发操作,所以,不一定非要创建时候的数字和dispatch_async异步的相等,也是可以模拟并发操作的。