iOS—多線程 鎖 互斥 同步

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

>>>方法一,@synchronized(id anObject),(最簡單的方法)
會自動對參數對象加鎖,保證臨界區內的代碼線程安全

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

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

  1. NSLock *theLock = [[NSLock alloc] init]; 
  2.  if ([theLock lock]) {
  3.     //do something here
  4.     [theLock unlock]; 

>>>方法三,NSRecursiveLock,遞歸鎖
NSRecursiveLock,多次調用不會阻塞已獲取該鎖的線程。

  1. NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init]; 
  2. void MyRecursiveFunction(int value) { 
  3.     [theLock lock]; 
  4.     if (value != 0) { 
  5.         –value; 
  6.         MyRecursiveFunction(value); 
  7.     }
  8.     [theLock unlock]; 
  9. MyRecursiveFunction(5);

>>>方法四,NSConditionLock,條件鎖
NSConditionLock,條件鎖,可以設置條件

  1. //公共部分
  2. id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA]; 
  3.  
  4. //線程一,生產者
  5. while(true) { 
  6.     [condLock lockWhenCondition:NO_DATA]; 
  7.     //生產數據
  8.     [condLock unlockWithCondition:HAS_DATA]; 
  9. }
  10.  
  11. //線程二,消費者
  12. while (true) { 
  13.     [condLock lockWhenCondition:HAS_DATA]; 
  14.     //消費
  15.     [condLock unlockWithCondition:NO_DATA]; 
  16. }

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

參考:

http://blog.sina.com.cn/s/blog_72819b170101590n.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章