iOS線程鎖簡單樣例

#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
相關文章
相關標籤/搜索