dispatch_semaphore应用

1,323 阅读1分钟

简介

dispatch_semaphore, 一般我们称之为信号量,功能类似于OC中的锁(比如NSLock@synchronized等),是一种基于计数器的多线程同步机制。

dispatch_semaphorey有三个常用函数
  • dispatch_semaphore_create
  • dispatch_semaphore_wait
  • dispatch_semaphore_signal

dispatch_semaphore_create(long value)

传入一个longvalue的值,代表的是允许多少个线程同时访问信号量

long dispatch_semaphore_wait(dispatch_semaphore_t dsema ,dispatch_time_t timeout)

传入dispatch_semaphore_create生成的信号量对象以及等待时间,具体逻辑是:如果dsema>0 那么 dsema-1 并 执行wait以后的代码 ,如果dsema <= 0等待,timeout标示等待时间。返回0的时候success执行接下来的代码,非0的话就一直等待timeout。

那么问题来了,`dispatch_semaphore_create(10)在执行dispatch_semaphore_wait之后返回多少呢?答案是0.

long dispatch_semaphore_signal(dispatch_semaphore_t aSema)

传入信号量,并对信号量进行+1操作

使用

_globalInstances是线程不安全的(比如NSMutableDictionary),

// 定义
static dispatch_semaphore_t _globalInstancesLock;
// 初始化
_globalInstancesLock = dispatch_semaphore_create(1);
// 使用详解:首先对信号量执行-1操作,如果结果
dispatch_semaphore_wait(_globalInstancesLock, DISPATCH_TIME_FOREVER);
[_globalInstances setObject:cache forKey:cache.path];
dispatch_semaphore_signal(_globalInstancesLock);

第二种使用action2 依赖于action1的执行完毕

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    dispatch_async(queue, ^{
        //do action1
        dispatch_semaphore_signal(sema);
    });
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
			  //do action2
    NSLog(@"结束了");