阅读 746

iOS读写锁的实现

前提

iOS开发中,大部分时间都是采用互斥锁,但是当多读少写的情况时,互斥锁会比较浪费加解锁的时间,所以此时就应该采用读写锁。

读写锁具有以下特点:

  • 同一时间,只能有一个线程进行写的操作。
  • 同一时间,允许有多个线程进行读的操作。
  • 同一时间,不允许既有写的操作,又有读的操作。

一、pthread_rwlock_init

pthread_rwlock_t lock;
// 初始化锁
pthread_rwlock_init(&lock, NULL);
// 读-加锁
pthread_rwlock_rdlock(&lock);
// 读-尝试加锁
pthread_rwlock_tryrdlock(&lock);
// 写-加锁
pthread_rwlock_wrlock(&lock);
// 写-尝试加锁
pthread_rwlock_trywrlock(&lock);
// 解锁
pthread_rwlock_unlock(&lock);
// 销毁
pthread_rwlock_destroy(&lock);
复制代码

二、dispatch_barrier_async

dispatch_barrier_async也被叫做栅栏块、同步点,简单的说就是在并行队列中的一个同步点,在dispatch_barrier_async之后的异步任务,需要等到dispatch_barrier_async执行完成后,才可以执行。

// 创建一个并行队列
dispatch_queue_t queue = dispatch_queue_create("LLDebugtool.com", DISPATCH_QUEUE_CONCURRENT);

// 执行一些读操作
dispatch_sync(queue, ^{
    // Read action1.
});

dispatch_sync(queue, ^{
    // Read action2.
});

...
// 写操作
dispatch_barrier_async(queue, ^{
    // Write action.
});

// 继续执行读操作
dispatch_sync(queue, ^{
    // Read action3.
});

dispatch_sync(queue, ^{
    // Read action4.
});

复制代码