美文网首页
如何实现多读单写

如何实现多读单写

作者: lth123 | 来源:发表于2021-06-27 16:41 被阅读0次
    一.使用GCD实现多读单写
    1.dispatch_barrier_async

    dispatch_barrier_sync()或者dispatch_barrier_async()入队的block,会等到所有的之前入队的block执行完成后才开始执行。在barrier block后面入队的所有的block,会等到到barrier block本身已经执行完成之后才继续执行。

    • dispatch_barrier 是一个类似于dispatch_async()/dispatch_sync()的API,它可以将barrier block提交到队列中,barrier block 只有提交到自定义的并发队列中才能真正的当做一个栅栏,它在这里起到一个承上启下的作用,只有比它(barrier block)先提交到自定义并发队列的block全部执行完成,它才会去执行,等它执行完成,在它之后添加的block才会继续往下执行。
    • 当dipatch_barrier block没有被提交到自定义的串行队列中,它与dispatch_async()/dispatch_sync()的作用是一样的。

    场景需求:需要异步完成三个任务。任务一、任务二、任务三。要求:任务三必须在任务一、任务二完成之后触发。这就需要使用dispatch_barrier_async。
    特点:像一堵围墙、成为任务的分割线。

        dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            //任务1
            for (int i = 0; i < 2; i++) {
                NSLog(@"我是任务一、来自线程:%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            //任务2
            for (int i = 0; i < 2 ; i++) {
                NSLog(@"我是任务二、来自线程:%@",[NSThread currentThread]);
            }
        });
        
        
        dispatch_barrier_async(queue, ^{
            //栅栏
            for (int i = 0; i < 1 ; i++) {
                NSLog(@"我是分割线、来自线程:%@",[NSThread currentThread]);
            }
        });
        
        dispatch_async(queue, ^{
            //任务3
            for (int i = 0; i < 1 ; i++) {
                NSLog(@"我是任务三、来自线程:%@",[NSThread currentThread]);
            }
        });
    
    
    2.使用dispatch_barrier_async实现多读单写锁
    - (void)test2{
        // 这里必须的自定义的并发队列,不能使用全局并发队列,或者串行队列
        self.queue = dispatch_queue_create("my_quene", DISPATCH_QUEUE_CONCURRENT);
        
        for (int i = 0; i < 10; i++) {
            dispatch_async(self.queue, ^{
                [self read];
            });
            
            dispatch_async(self.queue, ^{
                [self read];
            });
            
            dispatch_async(self.queue, ^{
                [self read];
            });
            
            dispatch_barrier_async(self.queue, ^{
                [self write];
            });
        }
    }
    
    
    - (void)read {
        NSLog(@"read");
    }
    
    - (void)write
    {
        NSLog(@"write");
    }
    
    一.使用pthread_rwlock_t实现多读单写
    #import "ViewController.h"
    #import <pthread.h>
    
    @interface ViewController ()
    @property (assign, nonatomic) pthread_rwlock_t lock;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 初始化锁
        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);
        
        NSLog(@"read");
        
        pthread_rwlock_unlock(&_lock);
    }
    
    - (void)write
    {
        pthread_rwlock_wrlock(&_lock);
        
    
        NSLog(@"write");
        
        pthread_rwlock_unlock(&_lock);
    }
    
    - (void)dealloc
    {
        pthread_rwlock_destroy(&_lock);
    }
    
    
    @end
    
    • pthread_rwlock_rdlock 读取锁
    • pthread_rwlock_wrlock 写入锁
    • pthread_rwlock_destroy 销毁锁

    相关文章

      网友评论

          本文标题:如何实现多读单写

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