1. 程式人生 > >iOS 多執行緒 鎖 互斥 同步

iOS 多執行緒 鎖 互斥 同步

在iOS中有幾種方法來解決多執行緒訪問同一個記憶體地址的互斥同步問題:

方法一,@synchronized(id anObject),(最簡單的方法)
會自動對引數物件加鎖,保證臨界區內的程式碼執行緒安全

[cpp] view plain copy  print?
  1. @synchronized(self)  
  2. {  
  3.        // 這段程式碼對其他 @synchronized(self) 都是互斥的       
  4.        // self 指向同一個物件
  5. }   

方法二,NSLock
NSLock物件實現了NSLocking protocol,包含幾個方法:
lock,加鎖
unlock,解鎖
tryLock,嘗試加鎖,如果失敗了,並不會阻塞執行緒,只是立即返回NO
lockBeforeDate:,在指定的date之前暫時阻塞執行緒(如果沒有獲取鎖的話),如果到期還沒有獲取鎖,則執行緒被喚醒,函式立即返回NO
比如:

[cpp] view plain copy  print?
  1. NSLock *theLock = [[NSLock alloc] init];   
  2. if ([theLock lock])   
  3. {  
  4.    //do something here
  5.    [theLock unlock];   
  6. }   
方法三,NSRecursiveLock,遞迴鎖
NSRecursiveLock,多次呼叫不會阻塞已獲取該鎖的執行緒。
[cpp] view plain copy  print?
  1.  NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];   
  2.  void MyRecursiveFunction(int value)   
  3. {   
  4.  [theLock lock];   
  5.  if (value != 0)   
  6. <span style="font-size:14px;"> </span>{   
  7.     –value;   
  8.     MyRecursiveFunction(value);   
  9.  }  
  10.  [theLock unlock];   
  11. }   
  12.  MyRecursiveFunction(5);  

方法四,NSConditionLock,條件鎖
NSConditionLock,條件鎖,可以設定條件

[cpp] view plain copy  print?
  1. //公共部分
  2. id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];   
  3.  //執行緒一,生產者
  4.  while(true) {   
  5.         [condLock lockWhenCondition:NO_DATA];   
  6.         //生產資料
  7.         [condLock unlockWithCondition:HAS_DATA];   
  8. }  
  9.  //執行緒二,消費者
  10.  while (true) {   
  11.         [condLock lockWhenCondition:HAS_DATA];   
  12.         //消費
  13.         [condLock unlockWithCondition:NO_DATA];   
  14. }  

方法五,NSDistributedLock,分佈鎖
NSDistributedLock,分佈鎖,檔案方式實現,可以跨程序
用tryLock方法獲取鎖。
用unlock方法釋放鎖。
如果一個獲取鎖的程序在釋放鎖之前掛了,那麼鎖就一直得不到釋放了,此時可以通過breakLock強行獲取鎖。