多線程知識整理2

NSConditionLock

  • 是對NSCondition的進一步封裝??梢栽O置具體條件


    image.png

dispatch_queue

  • 直接使用GCD的串行隊列,也可以實現線程同步

DISPATCH_QUEUE_SERIAL

dispatch_semaphore

  • semaphore 信號量
  • 信號量的初始值,可以用來控制線程并發(fā)訪問的最大數量
  • 信號量的初始值為1,代表同時只允許1條線程訪問資源,保證線程同步


    image.png

@synchronized

@synchronized 是對mutex遞歸鎖的封裝

//蘋果不推薦使用 因為性能不好 

@sychronized(self){
   [self doSomething];
}
---------------------------
// 保證鎖不變 

static NSObject * lock;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    lock = [[NSObject alloc] init];
});
@synchronized(lock){
     [self doSomething];
}


iOS線程同步方案性能比較

image.png

//更推薦使用 dispatch_semaphore 和 pthread_mutex

自旋鎖 互斥鎖 比較

  • 什么情況使用自旋鎖比較劃算?

預計線程等待鎖的時間很短
加鎖的代碼經常被調用,但競爭情況很少發(fā)生
CPU資源不緊張
多核處理器

  • 什么情況使用互斥鎖比較劃算?

預計線程等待鎖的時間較長
單核處理器
臨界區(qū)有IO操作
臨界區(qū)代碼復雜或者循環(huán)量大
臨界區(qū)競爭非常激烈的

atomic

  • 保證getter setter 原子操作
  • 相當于在getter和setter 內部加了線程同步的鎖
  • 并不能保證使用屬性的過程是線程安全的
  • iOS 上很少使用,因為頻繁的調用會非常耗損性能

讀寫安全方案

image.png

image.png

pthread_rwlock 讀寫鎖

  • 等待鎖的線程會進入休眠


    image.png

dispatch_barrier_async

  • 這個函數傳入的并發(fā)隊列必須是自己通過dispatch_queue_create創(chuàng)建的
  • 如果傳入的是一個串行或是一個全局的并發(fā)隊列,那這個函數便等同于dispatch_async函數的效果


    image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容