码迷,mamicode.com
首页 > 移动开发 > 详细

iOS线程锁简单样例

时间:2015-11-12 16:20:12      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:

#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


iOS线程锁简单样例

标签:

原文地址:http://my.oschina.net/u/2410306/blog/529420

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!