什麼是讀寫鎖 讀寫鎖是多線程下的一種同步機制, 它還有很多其他的名字,比如共用 獨占鎖等等。被它保護的資源有以下幾種狀態: 初始狀態 沒有線程訪問資源時所在的狀態 共用狀態 有多個讀線程訪問資源時進入共用狀態,這個時候允許新的讀線程訪問資源,但是寫線程必須等待 獨占狀態 寫線程訪問資源時進入獨占狀態 ...
什麼是讀寫鎖
讀寫鎖是多線程下的一種同步機制, 它還有很多其他的名字,比如共用-獨占鎖等等。被它保護的資源有以下幾種狀態:
初始狀態
沒有線程訪問資源時所在的狀態共用狀態
有多個讀線程訪問資源時進入共用狀態,這個時候允許新的讀線程訪問資源,但是寫線程必須等待獨占狀態
寫線程訪問資源時進入獨占狀態(只允許一個寫線程訪問),讀線程和更多的寫線程都必須等待
在Cocoa框架里提供了大量用於線程同步的類,如NSLock,NSCondition等等,但是卻沒有與讀寫鎖對應的類,下麵我們來嘗試自己模擬讀寫鎖的功能。
iOS下實現讀寫鎖的功能
共用狀態
由於需要允許多個線程進行讀操作,所以各個線程會使用單獨的鎖。
NSCondition *readerLock = [[NSCondition alloc] init]; [readerLock lock];
如果已經有寫操作在進行,讀操作必須等待,這裡需要藉助一個輔助變數來標識是不是已經有寫操作了。
if(self.writerCount == 1){ [readerLock wait]; }
同時我們也會使用一個變數記錄當前讀操作的數量,以便在所有的讀操作完成時通知等待中的寫操作。
@synchronized(self.readerCountLockObject) { self.readerCount++; }
在讀操作完成後,
@synchronized(self.readerCountLockObject) { self.readerCount--; } if(self.readerCount == 0){ [self.writerLock signal]; } [readerLock unlock];
獨占狀態
處理邏輯和處理讀操作類似,只不過允許的操作數量限製為1。
[self.writerLock lock]; if(self.writerCount != 0 || self.readerCount != 0){ [self.writerLock wait]; } @synchronized(self.writerCountLockObject) { self.writerCount++; } //寫操作,blabla.... @synchronized(self.writerCountLockObject) { self.writerCount--; } if(self.writerCount == 0){ for(NSInteger i = 0; i < self.readerLocks.count; i++){ [[self.readerLocks objectAtIndex:i] signal]; } } [self.writerLock unlock];