1.信号量 并发
dispatch_semaphore_t async
在NSOperation中,能够直接设置最大并发数来控制并发数量,在GCD中,控制并发数量由信号量来完成。函数
信号量是一个整形值而且具备一个初始计数值,而且支持两个操做:信号通知和等待。当一个信号量被信号通知,其计数会被增长。当一个线程在一个信号量上等待时,线程会被阻塞(若是有必要的话),直至计数器大于零,而后线程会减小这个计数。
spa
在GCD中有三个函数是semaphore的操做,分别是:线程
dispatch_semaphore_create 建立一个semaphorecode
dispatch_semaphore_signal 发送一个信号orm
dispatch_semaphore_wait 等待信号对象
简单的介绍一下这三个函数,第一个函数有一个整形的参数,咱们能够理解为信号的总量,dispatch_semaphore_signal是发送一个信号,天然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,不然就能够正常的执行,并让信号总量-1,根据这样的原理,咱们即可以快速的建立一个并发控制来同步任务和有限资源访问控制。递归
//信号量:整数值,最多有10个线程并发 dispatch_semaphore_t semaphore = dispatch_semaphore_create(10); for (int i = 0; i < 100; i++) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //当前信号量-1 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); NSLog(@"%d",i+1); //线程休眠 //C //sleep(1); //OC [NSThread sleepForTimeInterval:1]; //当前信号量+1 dispatch_semaphore_signal(semaphore); }); }
阻塞线程:资源
/**阻塞线程*/ // 建立一个信号量,值为0 dispatch_semaphore_t sema = dispatch_semaphore_create(0); // 在一个操做结束后发信号,这会使得信号量+1 ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { dispatch_semaphore_signal(sema); }); // 一开始执行到这里信号量为0,线程被阻塞,直到上述操做完成使信号量+1,线程解除阻塞 dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
2.条件锁
条件锁能够控制线程的执行次序,至关于NSOperation中的依赖关系
/* 常见的锁: 1.@synchronized(对象) 对象锁 2.NSLock 互斥锁 3.NSConditionLock 条件锁 NSRecursiveLock 递归锁 */ //条件锁,条件是整数值 NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:3]; //不要在外面加锁,那样锁的是主线程 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //加锁 [lock lockWhenCondition:3]; NSLog(@"111111111111"); //解锁 [lock unlockWithCondition:4]; }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //加锁 [lock lockWhenCondition:4]; NSLog(@"222222222222"); //解锁 [lock unlock]; });