美文网首页
GCD中dispatch_semaphore的使用

GCD中dispatch_semaphore的使用

作者: 邓布利多教授 | 来源:发表于2019-03-11 13:44 被阅读0次
    • dispatch_semaphore:信号量

    可以理解为房间里电灯的开关,灯开着的时候,可以做事,灯关闭的时候,不可以做事。

    系统为dispatch_semaphore提供了三个函数:

    
    /*
    创建信号量,并设置一个总数value
    */
    dispatch_semaphore_create(long value);
    
    /*
    等待信号
    */
    dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
    
    /*
    发送信号
    */
    dispatch_semaphore_signal(dispatch_semaphore_t dsema);
    

    举例说明使用场景

    例如一个工人在一个厂房里工作

    /*
    创建厂房,假设这个厂房里有一个电灯是开着的
    */
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    
    /*
    工人进来厂房,发现有一个电灯亮着,那么他就要工作
    (监听到信号量为1,继续进行,并自动执行信号量-1操作;当监听到信号量为0时,原地等待,不会往下进行,且不会对信号量有任何操作)
    */
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    /*
    工人在工作,假设他在打印文件
    */
    for(int i = 0; i < 10; i ++){
      
    //当他打印到第五份文件的时候,厂房里面的电灯被关闭了,那么他发现没有亮光了,然后他就站在原地,什么都看不见,什么都做不了了
    if(i == 4){
    //发送信号,告诉工人唯一开着的电灯关闭了
    dispatch_semaphore_signal(semaphore);
    }
    }
    
    

    使用信号量dispatch_semaphore实现最大并发

        //并发
        dispatch_queue_t concurrent = dispatch_queue_create("CONCURRENT", DISPATCH_QUEUE_CONCURRENT);
        //串行
        dispatch_queue_t serial = dispatch_queue_create("SERIAL",DISPATCH_QUEUE_SERIAL);
        //最大并发3个任务
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(5);
        
        for (int i = 0; i < 10; i++) {
            
            dispatch_async(serial, ^{
                
                //等待状态
                dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
                
                //异步执行并发队列
                dispatch_async(concurrent, ^{
                    
                    NSLog(@"沉睡前:%@开始执行任务%d",[NSThread currentThread],i);
                    sleep(3);
                    NSLog(@"沉睡后:%@结束执行任务%d",[NSThread currentThread],i);
                    
                    dispatch_semaphore_signal(semaphore);
                    
                });
                
            });
            
        }
        
        NSLog(@"主线程");
    

    对信号量dispatch_semaphore的封装

    QSDispatchQueue

    相关文章

      网友评论

          本文标题:GCD中dispatch_semaphore的使用

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