标签:
#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
标签:
原文地址:http://my.oschina.net/u/2410306/blog/529420