美文网首页工作生活
iOS GCD之dispatch_semaphore信号量解析

iOS GCD之dispatch_semaphore信号量解析

作者: jimmywife | 来源:发表于2019-07-03 19:53 被阅读0次

首先有一个问题:

假设现在只有两条空闲资源可以利用,但是同一时间有三个线程需要进行访问,这种情况该如何处理呢?

1.什么是信号量dispatch_semaphore?
信号量就是一种可以用来进行控制访问资源的数量的标识,设定了一个信号量,
在线程访问之前,加上信号量的处理则可告知系统按我们制定的信号数量来执行
多个线程。
2.信号量主要有3个函数:
//创建信号量,参数:信号量的初值,如果小于0则会返回NULL
dispatch_semaphore_create(信号量值)
//等待降低信号量
dispatch_semaphore_wait(信号量,等待时间)
//提高信号量
dispatch_semaphore_signal(信号量)

正常的使用顺序是先降低然后再提高,这两个函数通常成对使用

3.使用:
 -(void)dispatchSignal {
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
      //任务1
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 1");
        sleep(1);
        NSLog(@"complete task 1");
        dispatch_semaphore_signal(semaphore);
    });
      //任务2
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");NSLog(@"complete task 3");
        dispatch_semaphore_signal(semaphore);
    });
       //任务3
    dispatch_async(quene, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 3");
        sleep(1);
        NSLog(@"complete task 3");
        dispatch_semaphore_signal(semaphore);
    });
}

结果是:NSLog(@"run task 1");
NSLog(@"run task 2");
NSLog(@"complete task 2");
NSLog(@"complete task 1");
NSLog(@"run task 3");
NSLog(@"complete task 3");

总结:由于设定的信号值为2,先执行两个线程,等执行完一个,才会继续执行下一个,保证同一时间执行的线程数不超过2。

假设信号量是1的话则结果就会为:NSLog(@"run task 1");
NSLog(@"complete task 1");
NSLog(@"run task 2");
NSLog(@"complete task 2");
NSLog(@"run task 3");
NSLog(@"complete task 3");

相关文章

网友评论

    本文标题:iOS GCD之dispatch_semaphore信号量解析

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