简介
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(@"结束了");