dispatch_semaphore_create :
查看文档 发现只有三个 API:
- dispatch_semaphore_create(long value);
- dispatch_semaphore_wait(dispatch_semaphore_t dsema,dispatch_time_t timeout);
- dispatch_semaphore_signal(dispatch_semaphore_t dsema);
创建semaphore
long count = 1;
dispatch_semaphore_t lock = dispatch_semaphore_create(count);
传入的信号量参数count
必须大于或者等于0,否则lock为Null,可以把信号量count
理解为支持的最大并发线程个数
注意,当lock为成员变量或属性时,有线程在等待执行的话,根据超时时间self 会延迟或者永远(DISPATCH_TIME_FOREVER)不会释放。
等待信号
long wait = dispatch_semaphore_wait(lock,
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)));
第二个参数为等待的时间,这里是等待2秒。
执行这个API会判断当前的信号量count
是否大于0,大于0则继续执行,并且信号量count
-1,否则等待超时时间或信号量+1。
发信号
long signal = dispatch_semaphore_signal(lock);