如何实现多读单写

2021-06-27  本文已影响0人  lth123
一.使用GCD实现多读单写
1.dispatch_barrier_async

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

场景需求:需要异步完成三个任务。任务一、任务二、任务三。要求:任务三必须在任务一、任务二完成之后触发。这就需要使用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
上一篇 下一篇

猜你喜欢

热点阅读