對iOS鎖的一些研究

2021-07-11 14:54:22 字數 2161 閱讀 8272

[objc]view plain

copy

#import 

#import 

#import 

#import 

#define iterations (1024*1024*32)

- (void

)testlock  

now = cfabsolutetimegetcurrent();  

printf("nslock: %f sec\n"

, now-then);  

then = cfabsolutetimegetcurrent();  

for(i=0;i

now = cfabsolutetimegetcurrent();  

printf("pthread_mutex: %f sec\n"

, now-then);  

then = cfabsolutetimegetcurrent();  

for(i=0;i

now = cfabsolutetimegetcurrent();  

printf("osspinlock: %f sec\n"

, now-then);  

idobj = [nsobject

new];  

then = cfabsolutetimegetcurrent();  

for(i=0;i

}  now = cfabsolutetimegetcurrent();  

printf("@synchronized: %f sec\n"

, now-then);  

}  }  

最近因為程式中頻繁使用到了鎖,不知道各種鎖對效能的影響,今天稍作測試。順便研究下裡面的機制。

測試原理:在乙個執行緒中,對空**段執行指定次數的加解鎖。算出時間差。

測試結果

可以看出來,用synchronized效率是最低的,而osspinlock效率高到無法直視。

@synchronized建立給@synchronized指令的物件是乙個用來區別保護塊的唯一標示符。如果你在兩個不同的執行緒裡面執行上述方法,每次在乙個執行緒傳遞了乙個不同的物件給anobj引數,那麼每次都將會擁有它的鎖,並持續處理,中間不被其他執行緒阻塞。然而,如果你傳遞的是同乙個物件,那麼多個執行緒中的乙個執行緒會首先獲得該鎖,而其他執行緒將會被阻塞直到第乙個執行緒完成它的臨界區。

作為一種預防措施,@synchronized塊隱式的新增乙個異常處理例程來保護**。該處理例程會在異常丟擲的時候自動的釋放互斥鎖。這意味著為了使用@synchronized指令,你必須在你的**中啟用異常處理。了如果你不想讓隱式的異常處理例程帶來額外的開銷,你應該考慮使用鎖的類。

osspinlock官方描述

spin locks are a ******, fast, thread-safe synchronization primitive that is suitable in situations

where contention is expected to be low. the spinlock operations use memory barriers to synchronize

access to shared memory protected by the lock. preemption is possible while the lock is held.

如果只是粗略的使用鎖,不考慮效能問題可以使用synchronized。

如果對效率有較高的要求,還是採用osspinlock比較好。

因為pthread的鎖在也是用osspinlock實現的。osspinlock的實現過程中,並沒有進入系統kernel,使用osspinlock可以節省系統呼叫和上下文切換。

resources

@synchronized, nslock, pthread, osspinlock showdown, done right

對CURL的一些研究

對curl的一些研究 前兩天看到有人求客戶端socket 發http包的 受flw版主啟發找了一些perl的資料,不過對perl 還是不太熟悉。也沒有深入的研究。無意中發現了libcurl.so 這個庫。去google上搜尋發現它是處理客戶端傳送http請求的庫 以及可以處理web伺服器回送回來的包...

對CURL的一些研究

前兩天看到有人求客戶端socket 發http包的 受flw版主啟發找了一些perl的資料,不過對perl 還是不太熟悉。也沒有深入的研究。無意中發現了libcurl.so 這個庫。去google上搜尋發現它是處理客戶端傳送http請求的庫以及可以處理web伺服器回送回來的包。研究 了兩天將研究的成...

對CURL的一些研究

對curl的一些研究 前兩天看到有人求客戶端socket 發http包的 受flw版主啟發找了一些perl的資料,不過對perl 還是不太熟悉。也沒有深入的研究。無意中發現了libcurl.so 這個庫。去google上搜尋發現它是處理客戶端傳送http請求的庫 以及可以處理web伺服器回送回來的包...