美文网首页ios开发专题
dispatch_semaphore_t信号量使用

dispatch_semaphore_t信号量使用

作者: zl520k | 来源:发表于2018-06-13 16:43 被阅读8次

    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信号量使用

        本文链接:https://www.haomeiwen.com/subject/fmojeftx.html