首页 > 移动平台 > 详细

iOS线程锁简单样例

时间:2015-11-12 16:18:09      阅读:359      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!