#import "ViewController.h" @interface ViewController () { NSInteger _cnt; NSLock *_lock; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //必须先创建锁 _lock = [[NSLock alloc] init]; [NSThread detachNewThreadSelector:@selector(thread1Click) toTarget:self withObject:nil]; [NSThread detachNewThreadSelector:@selector(thread2Click) toTarget:self withObject:nil]; } /* 下面两个线程 执行的函数 共同操作同一个资源变量 如果我们不做任何处理 那么两个线程就会争抢资源,这样就达不到我们想要的效果,数据有可能导致比较混乱 //如果两个线程要操作同一个资源,那么我们一般要进行加锁保护,当访问资源的时候进行加锁,访问结束 解锁 */ #pragma mark - 子线中调用的函数 //线程1想做 两次执行 之间 间隔10 - (void)thread1Click{ NSLog(@"线程1开始"); //加锁 /* 一旦线程 执行 [_lock lock],先检测一下 有没有加锁,如果加锁那么当前线程就会阻塞 直到 这个锁解锁之后 才能继续执行,如果 锁 没有锁着,立即加上锁锁住继续执行下面的代码 同一个资源多个线程必须是同一把锁 //加锁的话要注意防止死锁 */ [_lock lock]; for (NSInteger i = 0; i < 10; i++) { _cnt += 10; NSLog(@"%s_cnt:%ld",__func__,_cnt); [NSThread sleepForTimeInterval:0.5]; } [_lock unlock]; NSLog(@"线程1即将结束"); } //线程2想要的现象是 每次间隔2 - (void)thread2Click{ NSLog(@"线程2开始"); [_lock lock]; for (NSInteger i = 0; i < 10; i++) { _cnt -= 2; NSLog(@"%s_cnt:%ld",__func__,_cnt); [NSThread sleepForTimeInterval:0.5]; } [_lock unlock]; NSLog(@"线程2即将结束"); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
时间: 2024-11-01 02:50:17