美文网首页
多线程:iOS中的读写安全方案

多线程:iOS中的读写安全方案

作者: 东方诗空 | 来源:发表于2022-04-24 09:50 被阅读0次

    iOS中的读写安全方案

    思考如何实现以下场景
    同一时间,只能有1个线程进行写的操作
    同一时间,允许有多个线程进行读的操作
    同一时间,不允许既有写的操作,又有读的操作

    上面的场景就是典型的“多读单写”,经常用于文件等数据的读写操作,iOS中的实现方案有

    pthread_rwlock:读写锁
    dispatch_barrier_async:异步栅栏调用

    pthread_rwlock

    等待锁的线程会进入休眠


    image.png
    
    - (void)test {
        // 初始化锁
        pthread_rwlock_init(&_lock, NULL);
        
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        
        for (int i = 0; i < 10; i++) {
            dispatch_async(queue, ^{
                [self read];
            });
            dispatch_async(queue, ^{
                [self write];
            });
        }
    }
    
    - (void)read {
        pthread_rwlock_rdlock(&_lock);
        
        sleep(1);
        NSLog(@"%s", __func__);
        
        pthread_rwlock_unlock(&_lock);
    }
    
    - (void)write
    {
        pthread_rwlock_wrlock(&_lock);
        
        sleep(1);
        NSLog(@"%s", __func__);
        
        pthread_rwlock_unlock(&_lock);
    }
    
    - (void)dealloc
    {
        pthread_rwlock_destroy(&_lock);
    }
    
    

    dispatch_barrier_async 异步栅栏

    这个函数传入的并发队列必须是自己通过dispatch_queue_cretate创建的

    如果传入的是一个串行或是一个全局的并发队列,那这个函数便等同于dispatch_async函数的效果


    image.png
     (void)viewDidLoad {
        [super viewDidLoad];
    
        self.queue = dispatch_queue_create("rw_queue", DISPATCH_QUEUE_CONCURRENT);
    
        for (int i = 0; i < 10; i++) {
            [self read];
            [self read];
            [self read];
            [self write];
        }
    }
    
    
    - (void)read {
        dispatch_async(self.queue, ^{
            sleep(1);
            NSLog(@"read");
        });
    }
    
    - (void)write
    {
        dispatch_barrier_async(self.queue, ^{
            sleep(1);
            NSLog(@"write");
        });
    }
    
    

    示意图


    image.png

    相关文章

      网友评论

          本文标题:多线程:iOS中的读写安全方案

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