小碼哥iOS學習筆記第二十三天: 文件的讀寫安全

  • 思考如何實現如下場景併發

    • 同一時間,只能有1個線程進行寫的操做
    • 同一時間,容許有多個線程進行讀的操做
    • 同一時間,不容許既有寫的操做,又有讀的操做
  • 上面的場景就是典型的多讀單寫,常常用於文件等數據的讀寫操做,iOS中的實現方案有異步

    • pthread_rwlock:讀寫鎖
    • dispatch_barrier_async:異步柵欄調用

1、pthread_rwlock

  • API使用
// 定義讀寫鎖
pthread_rwlock_t rwlock;
// 初始化讀寫鎖
pthread_rwlock_init(&rwlock, NULL);
// 讀取加鎖
pthread_rwlock_rdlock(&rwlock);
// 嘗試讀取加鎖
pthread_rwlock_tryrdlock(&rwlock);
// 寫入加鎖
pthread_rwlock_wrlock(&rwlock);
// 嘗試寫入加鎖
pthread_rwlock_trywrlock(&rwlock);
// 解鎖
pthread_rwlock_unlock(&rwlock);
// 銷燬讀寫鎖
pthread_rwlock_destroy(&rwlock);
複製代碼
  • 讀取寫入模擬測試代碼以下

  • 運行結果, 能夠看到只有讀取時間間隔很小, 可是寫入和讀取之間間隔都是1秒, 說明能夠多讀單寫, 而且讀取和寫入不能同時進行

2、dispatch_barrier_async

  • 這個函數傳入的併發隊列必須是本身經過dispatch_queue_cretate建立的async

  • 若是傳入的是一個串行或是一個全局的併發隊列,那這個函數便等同於dispatch_async函數的效果函數

  • 原理以下圖測試

  • 模擬測試代碼以下

  • 運行程序, 能夠看到, 同一之間內能夠多條線程讀取, 可是同一時間內只能有一條線程寫入

相關文章
相關標籤/搜索