信号量不仅可以当成读写锁来使用, 也可以控制线程的最大并发数.
1. 读写锁
多个线程读写数据, 有可能造成数据不一致或者冲突的情况, 如多个线程同时对可变数组进行操作, 需要对每个线程的访问进行加锁操作.
-(void)setName:(NSString *)name{
dispatch_semaphore_wait(self.nameStrSemaphore, DISPATCH_TIME_FOREVER);
_name = [name copy];
dispatch_semaphore_signal(self.nameStrSemaphore);
}
2. 控制并发数
当资源被占用完后, 新的线程就需要等待, 直到有新的资源被释放, 才能被等待的线程使用.
- (void)test1 {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_semaphore_t sema = dispatch_semaphore_create(2);
//任务1
dispatch_async(queue, ^{
[self test1:1 semaphore:sema];
});
//任务2
dispatch_async(queue, ^{
[self test1:2 semaphore:sema];
});
//任务3
dispatch_async(queue, ^{
[self test1:3 semaphore:sema];
});
}
- (void)test1:(NSInteger)num semaphore:(dispatch_semaphore_t)semaphore {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"执行任务%li",num);
sleep(1);
NSLog(@"任务%li完成",num);
dispatch_semaphore_signal(semaphore);
}