JHHK

欢迎来到我的个人网站
行者常至 为者常成

目录

NSLock

self.countLock = [[NSLock alloc] init];

- (void)__countMinus {
[self.countLock lock];
[super __countMinus];
[self.countLock unlock];
}

NSCondition

self.countLock = [[NSCondition alloc] init];
- (void)__countMinus {
[self.countLock lock];
[super __countMinus];
[self.countLock unlock];
}
- (IBAction)orderExec {
    NSConditionLock *conditionLock = [[NSConditionLock alloc] initWithCondition:3];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [conditionLock lockWhenCondition:3];
        NSLog(@"lxy:1");
        [conditionLock unlockWithCondition:2];
    });
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [conditionLock lockWhenCondition:2];
        NSLog(@"lxy:2");
        [conditionLock unlockWithCondition:1];
    });
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [conditionLock lockWhenCondition:1];
        NSLog(@"lxy:3");
        [conditionLock unlockWithCondition:0];
    });
}

Semaphore

- (IBAction)semaphoreOrder {
    
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务1");
        dispatch_semaphore_signal(sem);
    });
    
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务2");
        dispatch_semaphore_signal(sem);
    });
    
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务3");
    });
}

读写锁

- (void)viewDidLoad {
    [super viewDidLoad];
    self.dataDic = [NSMutableDictionary new];
    self.iQueue = dispatch_queue_create("lg", DISPATCH_QUEUE_CONCURRENT);
}


- (IBAction)moreReadSigleWrite:(id)sender {
    
    for (int i = 0; i<10; i++) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            if (i == 5) {
                [self lg_write:[NSString stringWithFormat:@"%d-name" ,i]];
            } else {
                [self lg_read];
            }
        });
    }
}

- (NSString *)lg_read {
    // 异步读取
    __block NSString *ret;
    //此处用同步,是因为有返回值。用异步返回值就不准确了
    dispatch_sync(self.iQueue, ^{
        // 读取的代码
        ret = self.dataDic[@"name"];
    });
    NSLog(@"%@",ret);
    return ret;
}

- (void)lg_write: (NSString *)name {
    // 写操作
    //用栅栏函数保证读写互斥
    dispatch_barrier_async(self.iQueue, ^{
        [self.dataDic setObject:name forKey:@"name"];
    });
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.