使用NSCondition实现多线程同步
iOS中實現多線程技術有非常多方法。
這里說說使用NSCondition實現多線程同步的問題,也就是解決生產者消費者問題(如收發同步等等)。
問題流程例如以下:
? ??消費者取得鎖,取產品,假設沒有,則wait,這時會釋放鎖,直到有線程喚醒它去消費產品;? ??生產者制造產品,首先也要取得鎖,然后生產,再發signal,這樣可喚醒wait的消費者。
這里須要注意wait和signal的問題:
? ? 1: 事實上,wait函數內部悄悄的調用了unlock函數(推測,有興趣可自行分析),也就是說在調用wati函數后,這個NSCondition對象就處于了無鎖的狀態,這樣其它線程就能夠對此對象加鎖并觸發該NSCondition對象。當NSCondition被其它線程觸發時,在wait函數內部得到此事件被觸發的通知,然后對此事件又一次調用lock函數(推測),而在外部看起來好像接收事件的線程(調用wait的線程)從來沒有放開NSCondition對象的全部權,wati線程直接由堵塞狀態進入了觸發狀態一樣。這里easy造成誤解。
? ? 2:?wait函數并非全然可信的。也就是說wait返回后,并不代表相應的事件一定被觸發了,因此,為了保證線程之間的同步關系,使用NSCondtion時往往須要增加一個額外的變量來對非正常的wait返回進行規避。
? ?3: 關于多個wait時的調用順序,測試發現與wait運行順序有關。詳細請查閱文檔。
前往github下載測試project:
https://github.com/zcsoft/ZCTest_NSCondtion
主要代碼片段:
// // ViewController.m // CondtionTest // // Created by cuibo on 11/12/14. // Copyright (c) 2014 cuibo. All rights reserved. //#import "ViewController.h"@interface ViewController ()@property(strong, nonatomic)NSCondition *condition; @property(strong, nonatomic)NSMutableArray *products;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.self.products = [[NSMutableArray alloc] init];self.condition = [[NSCondition alloc] init]; }- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated. }//點一下表示開始接受 - (IBAction)test1Button:(id)sender {[NSThread detachNewThreadSelector:@selector(thread1) toTarget:self withObject:nil]; }//點一下表示收到一個數據 - (IBAction)test2Button:(id)sender {[NSThread detachNewThreadSelector:@selector(thread2) toTarget:self withObject:nil]; }//發送線程 - (void)thread1 {while (1){NSLog(@"thread1:等待發送");[self.condition lock];[self.condition wait];NSLog(@"thread1:發送");[self.condition unlock];} }//接收線程 - (void)thread2 {[self.condition lock];NSLog(@"thread2:收到數據");[self.condition signal];[self.condition unlock]; }@end轉載于:https://www.cnblogs.com/blfshiye/p/4550387.html
總結
以上是生活随笔為你收集整理的使用NSCondition实现多线程同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 视频启动界面
- 下一篇: NSArray和NSMutableArr