dispatch_semaphore_t信号量使用

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异步的相等,也是可以模拟并发操作的。

你可能感兴趣的:(dispatch_semaphore_t信号量使用)