美文网首页
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