zoukankan      html  css  js  c++  java
  • 递归锁+条件锁+互斥锁-04-多线程

      1 //
      2 //  ViewController.m
      3 //  05-递归锁(recursive)+条件锁(condition)
      4 //
      5 //  Created by mac on 16/4/20.
      6 //  Copyright © 2016年 mac. All rights reserved.
      7 //
      8 /*
      9  
     10  3). 互斥锁
     11  NSLock *_lock;
     12 
     13 3)NSLock :不能多次调用,会产生死锁
     14  
     15  2016-04-20 16:06:44.600 05-递归锁(recursive)+条件锁(condition)[17107:4573400] *** -[NSLock lock]: deadlock (<NSLock: 0x7feceb542400> '(null)')
     16  2016-04-20 16:06:44.601 05-递归锁(recursive)+条件锁(condition)[17107:4573400] *** Break on _NSLockError() to debug.
     17 
     18  1)NSRecursiveLock:可以多次调用,在递归函数中调用
     19  对于递归锁:每次成功的lock都必须平衡调用unlock操作,只有所有的加锁和解锁都平衡时,锁才能真正的释放给其它线程所获得。
     20  
     21  2)NSConditionLock:
     22  保证加锁在condition1方法的unlockWithCondition之后进行
     23  lockWhenConditon会阻止线程往下执行,直到条件为上一次解锁时设置的条件时才能继续往下执行。
     24  条件锁可用于有特定顺序的处理流程中。
     25 */
     26 
     27 #import "ViewController.h"
     28 
     29 @interface ViewController ()
     30 
     31 @end
     32 
     33 @implementation ViewController {
     34     
     35     //1). 递归锁
     36     NSRecursiveLock *_recursiveLock;
     37     
     38     //2). 条件锁
     39     NSConditionLock *_conditionLock;
     40     
     41     //3). 互斥锁
     42     NSLock *_lock;
     43 }
     44 
     45 - (void)viewDidLoad {
     46     [super viewDidLoad];
     47 
     48 //    [self recursiveLock]; //递归锁
     49     [self conditionLock]; //条件锁
     50 }
     51 
     52 /**
     53  *  1. 递归锁应用
     54  */
     55 - (void)recursiveLock {
     56     //普通lock
     57     _lock = [[NSLock alloc] init];
     58     
     59     _recursiveLock = [[NSRecursiveLock alloc] init];
     60     
     61     [NSThread detachNewThreadSelector:@selector(recursiveAction:) toTarget:self withObject:@5];
     62 }
     63 - (void)recursiveAction:(NSNumber *)value {
     64     
     65     NSInteger currentValue = [value integerValue];
     66     
     67     NSInteger result = [self factorialMethod:currentValue];
     68     
     69     NSLog(@"%li", result);
     70 }
     71 - (NSInteger)factorialMethod:(NSInteger)value {
     72     
     73     [_recursiveLock lock];
     74     //[_lock lock];
     75     
     76     //1. 递归的出口
     77     if (value == 0) {
     78         
     79         [_recursiveLock unlock];//第2种情况下解锁
     80         //[_lock unlock];
     81         
     82         return 1;
     83     }
     84     
     85     [_recursiveLock unlock]; //第1种情况下解锁
     86     //2. 常规表达式
     87     return value * [self factorialMethod:value - 1];
     88     
     89 }
     90 
     91 /**
     92  *  2. 条件锁应用
     93  */
     94 - (void)conditionLock {
     95     
     96     _conditionLock = [[NSConditionLock alloc] init];
     97     
     98     [NSThread detachNewThreadSelector:@selector(conditionAction) toTarget:self withObject:nil];
     99     
    100     [NSThread detachNewThreadSelector:@selector(conditionLockAction) toTarget:self withObject:@10];
    101 }
    102 - (void)conditionAction {
    103     
    104     [_conditionLock lock];
    105     
    106     NSLog(@"_conditionLock");
    107     
    108     [NSThread sleepForTimeInterval:1];
    109     
    110     //解锁,并且设置下次加锁条件 tag==10
    111     [_conditionLock unlockWithCondition:10];
    112 }
    113 
    114 - (void)conditionLockAction {
    115     
    116     //保证加锁在condition1方法的unlockWithCondition之后进行
    117     [NSThread sleepForTimeInterval:2];
    118     
    119     //lockWhenCondition会阻止线程往下执行,直到条件为上一次解锁时设置的调件时才能继续往下执行:条件锁可用于特定顺序的处理流程中。
    120     [_conditionLock lockWhenCondition:10];
    121     
    122     NSLog(@"conditionLockAction");
    123     
    124     [_conditionLock unlock];
    125 }
    126 
    127 @end
    时光见证了成长,还很无知,我想一点点幼稚转为有知!
  • 相关阅读:
    咏南树形下拉列表数据敏感控件--TYNdbTreeList
    unigui session超时时间设置
    datasnap——动态注册服务类
    DataSnap——利用TParams进行多表事务更新
    咏南新CS插件开发框架支持DELPHI7
    centos7 samba安装与配置
    centos7设置系统语言为中文
    yndbtree控件
    Linux ClientDataSet libmidas.so.2
    菜单树
  • 原文地址:https://www.cnblogs.com/foreveriOS/p/5413357.html
Copyright © 2011-2022 走看看