iOS读写锁的实现

前提

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

读写锁具备如下特色:异步

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

1、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);
复制代码

2、dispatch_barrier_async

dispatch_barrier_async也被叫作栅栏块、同步点,简单的说就是在并行队列中的一个同步点,在dispatch_barrier_async以后的异步任务,须要等到dispatch_barrier_async执行完成后,才能够执行。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.
});

复制代码
相关文章
相关标签/搜索