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.
});

複製代碼
相關文章
相關標籤/搜索