美文网首页
iOS GCD用法之信号量(semaphore)

iOS GCD用法之信号量(semaphore)

作者: 那些喧嚣 | 来源:发表于2020-03-20 22:31 被阅读0次

问:有5个耗时任务,每次最多执行两次,如何实现?

1. 创建信号量

    /*
     创建信号量为2
     */
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

2. 创建队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

3.开始异步执行

信号量用法解释:

  • 信号量的数量初始化,最好就是使用要执行任务的多少来定,如题是两次,则设置为2
  • 每次执行一个任务,调用方法dispatch_semaphore_wait,让信号量减1
  • 每次结束一个任务,调用方法dispatch_semaphore_signal,让信号量+1
  • 信号量做了这些加减操作,如果信号量小于1,则任务不会执行,如果大于设置的信号量,则会多执行任务。所以,dispatch_semaphore_wait和dispatch_semaphore_signal应该是成对出现,才能保证信号量的设定

注意:
1.可以看出,如果设置信号量为1,就等同于同步执行的效果
2.也有一些用法是设置信号量为0的,进入任务的时候signal,离开任务的时候wait。

dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"1任务开始执行");
        
        [NSThread sleepForTimeInterval:3];
        
        NSLog(@"1任务结束执行");

        dispatch_semaphore_signal(semaphore);
        
    });
    
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"2任务开始执行");
        
        [NSThread sleepForTimeInterval:3];
        
        NSLog(@"2任务结束执行");

        dispatch_semaphore_signal(semaphore);
        
    });
    
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"3任务开始执行");
        
        [NSThread sleepForTimeInterval:3];
        
        NSLog(@"3任务结束执行");

        dispatch_semaphore_signal(semaphore);
        
    });
    
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"4任务开始执行");
        
        [NSThread sleepForTimeInterval:3];
        
        NSLog(@"4任务结束执行");

        dispatch_semaphore_signal(semaphore);
        
    });
    
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"5任务开始执行");
        
        [NSThread sleepForTimeInterval:3];
        
        NSLog(@"5任务结束执行");

        dispatch_semaphore_signal(semaphore);
    });

zzZZZ```

相关文章

网友评论

      本文标题:iOS GCD用法之信号量(semaphore)

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