美文网首页
信号量控制并发

信号量控制并发

作者: 活最好的自己 | 来源:发表于2019-04-21 18:29 被阅读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

    相关文章

      网友评论

          本文标题:信号量控制并发

          本文链接:https://www.haomeiwen.com/subject/jzpjgqtx.html