美文网首页
加强对iOS信号量的理解

加强对iOS信号量的理解

作者: lanmoyingsheng | 来源:发表于2018-10-10 17:34 被阅读23次

- (void)semaphoreDemo {
    
    // 这里可以尝试使用2,1,0,分别测试打印结果。
    dispatch_semaphore_t semathore = dispatch_semaphore_create(2);
    
    dispatch_queue_t queue = dispatch_queue_create("barr", DISPATCH_QUEUE_CONCURRENT);
    //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    
    dispatch_async(queue, ^{
        
        dispatch_semaphore_wait(semathore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"task 1");
        
        sleep(5);
        
        NSLog(@"task 1 finished");
        
        dispatch_semaphore_signal(semathore);
        
    });
    
    dispatch_async(queue, ^{
        
        dispatch_semaphore_wait(semathore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"task 2");
        
        sleep(5);
        
        NSLog(@"task 2 finished");
        
        dispatch_semaphore_signal(semathore);
        
    });
    
    dispatch_async(queue, ^{
        
        dispatch_semaphore_wait(semathore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"task 3");
        
        sleep(2);
        
        NSLog(@"task 3 finished");
        
        dispatch_semaphore_signal(semathore);
        
    });
    
    
}

打印结果:
2018-10-10 17:24:03.102436+0800 SemaphoreDemo[8970:206016] task 2
2018-10-10 17:24:03.102455+0800 SemaphoreDemo[8970:206017] task 1
2018-10-10 17:24:08.105001+0800 SemaphoreDemo[8970:206016] task 2 finished
2018-10-10 17:24:08.105019+0800 SemaphoreDemo[8970:206017] task 1 finished
2018-10-10 17:24:08.105172+0800 SemaphoreDemo[8970:206018] task 3
2018-10-10 17:24:10.110506+0800 SemaphoreDemo[8970:206018] task 3 finished

如果理解上面的代码,可以看下实际中的部分应用

func fetch_MSVA_data() {
    
    let semaphore = DispatchSemaphore(value: 0)
    let task = Alamofire.request(URLHelper.home_MSVA_Url()).responseJSON { (response) in
    
        if let dictionary = response.result.value  {
            
            self.msvaModel = HomeMSVAModel(jsonData:JSON(dictionary))
            self.calculeHomeAdvCellHeight()
        } else {
            self.msvaModel = nil
        }
    
        print("3")
        semaphore.signal() // 这里的当前线程是主线程,这里会唤醒被阻塞的线程。
    }
     
    // 这里会直接阻塞当前线程(当前线程不是主线程)
    let result = semaphore.wait(timeout: DispatchTime.now()+5)
    print("3:\(result)")
}

相关文章

  • 加强对iOS信号量的理解

    如果理解上面的代码,可以看下实际中的部分应用

  • 理解GCD

    (1)博客:深入理解GCD 理解iOS中的线程池 多线程理解 ?:(1)信号量--...

  • iOS GCD中级篇 - dispatch_semaphore(

    转载自:iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用理解这个概念之前,先抛...

  • 线程同步

    1.dispatch_semaphore(信号量)的理解及使用2.iOS 多线程同步策略之-----锁NSLock...

  • iOS底层--GCD应用

    手动目录GCD简介信号量信号量的理解信号量的使用信号量的代码实操信号量阻塞哪里的任务?栅栏函数dispatch_b...

  • 浅谈GCD信号量dispatch_semaphore_t

    理解信号量 理解信号量我们必须了解一下三个函数: dispatch_semaphore_create(long v...

  • 2、ios下如何实现指定线程数目的线程池?

    ios下如何实现指定线程数目的线程池? 1、GCD的信号量机制(dispatch_semaphore) 信号量是一...

  • iOS信号量的理解和使用

    iOS信号量的理解和使用 问题: 我们要下载很多图片,并发异步进行,每个下载都会开辟一个新线程,可是我们又担心太多...

  • 多线程的记录

    链接:NSOperation的基本用法 NSOperation iOS dispatch_semaphore信号量...

  • 2019-09-27

    iOS信号量 信号量的本质: 信号量的本质是数据操作锁, 它本身不具有数据交换的功能,而是通过控制其他的通信资源来...

网友评论

      本文标题:加强对iOS信号量的理解

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