Dispatch 信号量

作者: DEV_Yuan | 来源:发表于2016-03-31 19:24 被阅读3380次

    dispatch_semaphore_create(1) 创建一个 semaphore 信号总量为 1

    dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER) 如果信号总量为0,进入等待状态,信号量大于0时,继续执行代码,同时将信号总量 -1

    dispatch_semaphore_signal(lock); 发送信号量,信号量 +1

    使用时注意使用signal以确保编译器releasedispatch_semaphore_t时的值与初始值一致, 否则会EXC_BAD_INSTRUCTION ,见http://is.gd/EaJgk5

      dispatch_semaphore_t lock = dispatch_semaphore_create(1);
        
    
        for (int i = 0; i < 10; i++)
        {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
    
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
               
    
                NSLog(@"%d", i);
                
                dispatch_semaphore_signal(lock);
    
            });
        }
    
    

    获取通讯录

            dispatch_semaphore_t sema = dispatch_semaphore_create(0);
            ABAddressBookRequestAccessWithCompletion(abRef, ^(bool granted, CFErrorRef error)
                                                     {
                                                         isOpen =  granted;
                                                         dispatch_semaphore_signal(sema);
                                                     });
            
            dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
            
            CFRelease(abRef);
    
    

    使用 Dispatch Semaphore 控制并发线程数量

     void dispatch_async_limit(dispatch_queue_t queue,NSUInteger limitSemaphoreCount, dispatch_block_t block) {
    //控制并发数的信号量
        static dispatch_semaphore_t limitSemaphore;
       
        //专门控制并发等待的线程
        static dispatch_queue_t receiverQueue;
        
        //使用 dispatch_once而非 lazy 模式,防止可能的多线程抢占问题
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            limitSemaphore = dispatch_semaphore_create(limitSemaphoreCount);
            receiverQueue = dispatch_queue_create("receiver", DISPATCH_QUEUE_SERIAL);
        });
        
        // 如不加 receiverQueue 放在主线程会阻塞主线程
        dispatch_async(receiverQueue, ^{
            //可用信号量后才能继续,否则等待
            dispatch_semaphore_wait(limitSemaphore, DISPATCH_TIME_FOREVER);
            dispatch_async(queue, ^{
                !block ? : block();
                //在该工作线程执行完成后释放信号量
                dispatch_semaphore_signal(limitSemaphore);
            });
        });
    }
    
    

    ������
    �������������

    相关文章

      网友评论

        本文标题:Dispatch 信号量

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