美文网首页
利用dispatch_barrier_async设置读写锁

利用dispatch_barrier_async设置读写锁

作者: 杯子西瓜 | 来源:发表于2017-10-17 11:36 被阅读0次

    利用dispatch_barrier_async方法,可以对一个值设置读写锁,使读写过程线程安全。主要是限制“写”,保证每次“写”的时候是线程安全的。

    特点:
    必须要一个自定义并行队列,在栅栏中的任务,会等待在它之前加入到队列的任务都完成,才会执行;在他之后加入队列的任务,也会等它完成后才执行。

    用法:
    1. 栅栏必须要在自定义的并行队列中才能生效,所以得自己先创建一个并行队列。

    - (dispatch_queue_t)queue{
        
        if (!_queue) {
            _queue = dispatch_queue_create("my_lock", DISPATCH_QUEUE_CONCURRENT);
        }
    
        return _queue;
    }
    
    1. 在set方法里加栅栏,利用栅栏将赋值任务加入自定义队列,这样就保证在执行赋值的时候线程是安全的。
    - (void)setCountFlag:(NSInteger)countFlag{
        
        dispatch_barrier_async(self.queue, ^{
            _countFlag = countFlag;
            
        });
        
    }
    

    3.在get获取值的时候,也将取值任务放入自定义并行队列

     - (NSInteger)countFlag
    {
        __block NSInteger tempCountFlag;
        dispatch_sync(self.queue, ^{
            tempCountFlag = self.countFlag;
        });
        return tempCountFlag;
    }
    

    这样的话,所有对于countFlag读取操作的任务都在自定义的并行队列中,且在每次修改countFlag后,再去读取countFlag的值一定是修改后正确的值。之所以取值时用同步操作,是因为我们明确返回一个值后才去执行下面方法。并且self.queue队列中,并没有存在会阻塞线程的长时间操作。

    相关文章

      网友评论

          本文标题:利用dispatch_barrier_async设置读写锁

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