美文网首页iOS常用
GCD之信号量的使用

GCD之信号量的使用

作者: XiaoBaa | 来源:发表于2020-08-23 19:53 被阅读0次

一、 关键词解释

1)创建一个信号量: 
使用: dispatch_semaphore_t dispatch_semaphore_create(long value);
参数: long value 
1. 如果要使两个线程同步,传0
2. 如果要管理有限的临界资源,传资源个数
备注: 个人理解为该数字+1得到当前可同时执行的最大任务数量

2)等待(信号量 -1)
使用: 一个信号量: dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
1. 如果资源个数<0,那么这个方法会一直阻塞,直到信号(signal)的到来(返回值是0),

3)发送一个信号(信号量+1): 
使用: dispatch_semaphore_signal(semaphore);
1. 信号量+1,如果之前信号量<0,那么唤醒一个等待这个信号量的线程。

二、 使用

- (void)viewDidLoad {
  [super viewDidLoad];
  NSInteger result = [self doSomething];
  NSLog(@"result: %ld", (long)result); // 输出: result: 2
}
- (NSInteger)doSomething {
  __block NSInteger stepValue = 0;
  
  dispatch_queue_t myqueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

  // 任务1
  dispatch_async(myqueue, ^{
    NSLog(@"任务1 - 当前线程: %@", [NSThread currentThread]);
    stepValue += 1;
    dispatch_semaphore_signal(semaphore);
  });
  
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  
  // 任务2
  dispatch_async(myqueue, ^{
    NSLog(@"任务2 - 当前线程: %@", [NSThread currentThread]);
    stepValue += 1;
    dispatch_semaphore_signal(semaphore);
  });
  
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  
  return stepValue;
}

/* 输出:
 任务1 - 当前线程: <NSThread: 0x600002281bc0>{number = 4, name = (null)}
 任务2 - 当前线程: <NSThread: 0x600002281bc0>{number = 4, name = (null)}
 */

三、使用例子(比如: 获取相册权限)

- (BOOL)hasPermissionForOpenAlbum {
   __block BOOL hasPermission = NO;
  
  // 创建信号, 初始值为0
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
  
  [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    hasPermission = (status == PHAuthorizationStatusAuthorized);

    // 信号响应, 此时信号加1. 线程停止阻塞, 继续执行;
    dispatch_semaphore_signal(semaphore);
  }];

  // 信号量减1, 此时线程进行阻塞;
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  
  return hasPermission;
}

相关文章

网友评论

    本文标题:GCD之信号量的使用

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