你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 詳解iOS 多線程 鎖 互斥 同步

詳解iOS 多線程 鎖 互斥 同步

編輯:IOS開發綜合

在iOS中有幾種方法來解決多線程訪問同一個內存地址的互斥同步問題:

方法一,@synchronized(id anObject),(最簡單的方法)

會自動對參數對象加鎖,保證臨界區內的代碼線程安全

@synchronized(self) 
 
{ 
 
    // 這段代碼對其他 @synchronized(self) 都是互斥的     
 
    // self 指向同一個對象 
 
}  

方法二,NSLock
NSLock對象實現了NSLocking protocol,包含幾個方法:

  • lock,加鎖
  • unlock,解鎖
  • tryLock,嘗試加鎖,如果失敗了,並不會阻塞線程,只是立即返回NO
  • lockBeforeDate:,在指定的date之前暫時阻塞線程(如果沒有獲取鎖的話),如果到期還沒有獲取鎖,則線程被喚醒,函數立即返回NO

比如:

NSLock *theLock = [[NSLock alloc] init];  
if ([theLock lock])  
{ 
  //do something here 
  [theLock unlock];  
}  

方法三,NSRecursiveLock,遞歸鎖

NSRecursiveLock,多次調用不會阻塞已獲取該鎖的線程。

 NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];  
 void MyRecursiveFunction(int value)  
{  
 [theLock lock];  
 if (value != 0)  
<span style="font-size:14px;"> </span>{  
  –value;  
  MyRecursiveFunction(value);  
 } 
 [theLock unlock];  
}  
 
 MyRecursiveFunction(5); 

方法四,NSConditionLock,條件鎖

NSConditionLock,條件鎖,可以設置條件

//公共部分 
id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];  
    
 //線程一,生產者 
 while(true) {  
    [condLock lockWhenCondition:NO_DATA];  
    //生產數據 
    [condLock unlockWithCondition:HAS_DATA];  
} 
    
 //線程二,消費者 
 while (true) {  
    [condLock lockWhenCondition:HAS_DATA];  
    //消費 
    [condLock unlockWithCondition:NO_DATA];  
} 

方法五,NSDistributedLock,分布鎖

NSDistributedLock,分布鎖,文件方式實現,可以跨進程

  • 用tryLock方法獲取鎖。
  • 用unlock方法釋放鎖。

如果一個獲取鎖的進程在釋放鎖之前掛了,那麼鎖就一直得不到釋放了,此時可以通過breakLock強行獲取鎖。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved