国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

詳解iOS 多線程 鎖 互斥 同步

2019-10-21 18:49:45
字體:
來源:轉載
供稿:網友

在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強行獲取鎖。

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


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安岳县| 秦皇岛市| 呼玛县| 旬邑县| 大足县| 惠东县| 辽阳县| 芒康县| 清水河县| 江油市| 若羌县| 铁力市| 上饶县| 清流县| 上林县| 水城县| 宣城市| 苏尼特左旗| 昭觉县| 响水县| 堆龙德庆县| 华蓥市| 文化| 石城县| 共和县| 景德镇市| 塘沽区| 普安县| 南部县| 桐梓县| 冷水江市| 武功县| 九寨沟县| 宾川县| 壤塘县| 淄博市| 喀什市| 衡阳市| 乌鲁木齐县| 水城县| 于田县|