GCD 信号量

1、dispatch_semaphore_create:创建一个Semaphore并初始化信号的总量
2、dispatch_semaphore_signal:发送一个信号,让信号总量加1
3、dispatch_semaphore_wait:可以使总信号量减1,当信号量为0时就是一直等待(阻塞当前线程),否则就可以正常执行。

注意:信号量的使用前提是:想清楚需要处理哪个线程等待(阻塞),又要哪个线程继续执行,然后使用信号量。

一、GCD 信号量实现线程同步,将异步操作转换成同步操作

信号量

初始化信号量

  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    NSLog(@"2-------");
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        
        NSLog(@"异步结果------");
        dispatch_semaphore_signal(semaphore);
        
    });

    //信号量+1
    
    NSLog(@"3-------");

    
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    NSLog(@"4-------");

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"5-------");
截屏2022-09-07 下午4.10.11.png

二、线程安全 -- 多数据保护同一数据安全操作

dispatch_semaphore_t  semaphoreLock = dispatch_semaphore_create(1);

self.ticketSurplusCount = 50;

 //队列任务 
 dispatch_queue_t queue1 = dispatch_queue_create("net.bujige.testQueue1", 
DISPATCH_QUEUE_SERIAL);
 // 队列任务
 dispatch_queue_t queue2 = dispatch_queue_create("net.bujige.testQueue2", 
DISPATCH_QUEUE_SERIAL);

__weak typeof(self) weakSelf = self;
 dispatch_async(queue1, ^{
 [weakSelf saleTicketSafe];
 });
 
 dispatch_async(queue2, ^{
 [weakSelf saleTicketSafe];
 });

- (void)saleTicketSafe {
 while (1) {
 
 dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER);
 
 if (self.ticketSurplusCount > 0) { 
 self.ticketSurplusCount--;

 [NSThread sleepForTimeInterval:0.2];
 } else {  
 
 }
 
 dispatch_semaphore_signal(semaphoreLock);
 break;
 }
 
  dispatch_semaphore_signal(semaphoreLock);
 }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是信号量 信号量是一种特殊的变量,访问具有原子性。 当信号量大于0时执行wait操作信号量会减1, 当信号量为...
    lq_ios阅读 2,464评论 2 6
  • Dispatch Semaphore信号量是一种持有计数的信号,实际开发中主要用于保持线程同步,将异步任务转为同步...
    Geniune阅读 200评论 0 0
  • 摘自 原文链接 dispatch_semaphore是GCD用来同步的一种方式,与他相关的共有三个函数,分别是di...
    CoderWxd阅读 397评论 0 0
  • 前言:在研究《iOS 性能监控(二)—— 主线程卡顿监控》中,发现有一些GCD信号量的知识之前没有好好梳理过。故本...
    齐舞647阅读 6,993评论 0 5
  • 信号量是基于计数器的一种多线程同步机制,用来管理对资源的并发访问。信号量内部有一个可以原子递增或递减的值。如果一个...
    ElaineYin阅读 1,666评论 2 2