iOS 线程同步 NSLock、NSRecursiveLock、NSCondition、NSConditionLock
#import "ViewController.h" #import <pthread.h> @interface ViewController () @property (nonatomic, strong) NSCondition *lock; @property (nonatomic, strong) NSMutableArray *data; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.lock = [[NSCondition alloc]init]; self.data = [NSMutableArray array]; [self test]; // Do any additional setup after loading the view. } //同时执行 删除 添加操作 -(void)test{ [[[NSThread alloc]initWithTarget:self selector:@selector(add) object:nil] start]; [[[NSThread alloc]initWithTarget:self selector:@selector(remove) object:nil] start]; } -(void)add{ sleep(1); [self.lock lock]; [self.data addObject:@"A"]; NSLog(@"添加数据"); //发送信号通知条件能继续往下执行 [self.lock signal]; //广播信号 对应的条件能往下继续执行了 // [self.lock broadcast]; [self.lock unlock]; } -(void)remove{ NSLog(@"开始删除数据"); [self.lock lock]; if (self.data.count==0) { //这时候会等待条件、并且打开当前锁、 //收到条件信号之后会重新加锁并执行后面的代码 [self.lock wait]; } [self.data removeLastObject]; [self.lock unlock]; NSLog(@"删除数据"); }
#import "ViewController.h" @interface ViewController () @property (nonatomic, strong) NSConditionLock *lock; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.lock=[[NSConditionLock alloc]initWithCondition:1]; [[[NSThread alloc]initWithTarget:self selector:@selector(one) object:nil] start]; [[[NSThread alloc]initWithTarget:self selector:@selector(two) object:nil] start]; [[[NSThread alloc]initWithTarget:self selector:@selector(three) object:nil] start]; // Do any additional setup after loading the view. } -(void)one{ //条件依赖,当满足Condition为1时才会解锁 否 则会等待条件满足时进行加锁 [self.lock lockWhenCondition:1]; NSLog(@"one"); [self.lock unlockWithCondition:2]; } -(void)two{ [self.lock lockWhenCondition:2]; NSLog(@"two"); [self.lock unlockWithCondition:3]; } -(void)three{ [self.lock lockWhenCondition:3]; NSLog(@"three"); [self.lock unlock]; } @end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构