信号量控制并发

2019-04-21  本文已影响0人  活最好的自己

信号量不仅可以当成读写锁来使用, 也可以控制线程的最大并发数.

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);
}
NSURLSession下载.png
上一篇下一篇

猜你喜欢

热点阅读