NSCondition与NSConditionLock

本文深入探讨了条件变量和锁机制在多线程环境下的应用,包括条件变量的测试值、互斥锁的作用,以及如何使用NSCondition和NSConditionLock进行线程同步。通过具体的代码示例,展示了如何在iOS开发中利用这些机制来处理网络请求和数据通信转移过程。
摘要由CSDN通过智能技术生成

1.相同:条件变量、条件变量测试值(触动CPU控制各个线程的等待及唤醒)、互斥锁
2.不同:NSCondition条件量本身无自带聚焦锁(需要域外变量持有条件值判断条件枷锁)
3.网络请求:实现数据任务的通信转移过程

-(void)btnClicked:(UIButton *)psender{
    NSURL *url = [NSURL URLWithString:@"https://blog.csdn.net/qq_33226881"];//统一资源定位
    NSURLRequest *request = [NSURLRequest requestWithURL:url];//托管请求(层次)实例
    NSURLSession *session = [NSURLSession sharedSession];//会话通道(双向/单向)
    NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:0];//构建ConditionLock条件锁对象实例托管,锁条件为0
    dispatch_queue_t queue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);//开辟队列
    for (int i=0; i<10; i++) {
        //请求过程底层本质(定位数据任务会话通道中实现通信转移)(衍生URLSessionDataTask任务实例)
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {//data规则数据;response响应数据;error异常报错
            //completionHandler请求已完成回调块
            dispatch_async(queue, ^{//
                [lock lockWhenCondition:i];//当锁条件满足i时 加聚焦锁(CPU只执行当前线程(lockWhenCondition和unlockWithCondition之间指令),其他线程进入等待状态)
                NSLog(@"---%d",i);
                [lock unlockWithCondition:i+1];//解锁,并重置锁的条件为i+1(解除聚焦锁(CPU开始重新触动其他等待中的线程并锁的条件重置为i+1))
            });
        }];
        [task resume];//任务开始(触动异步线程)
    }
}

let a:Int = 2
let cond = NSCondition()
cond.lock()
debug("等待条件-----1111")

while a == 2{
cond.wait()

}

cond.unlock()
debug("条件得到!--------1111")
-------------------------------------------------------------------

let lock = NSConditionLock(condition: 2)
debug("等待条件-------2222")

lock.lock(whenCondition: 2)
debug("等待条件---------2222")

lock.unlock()
debug("条件得到-------2222")

NSConditionLock 继承类NSObject 遵从的协议NSLocking(lock /unlock) NSObject
//获取和释放锁
1、– (BOOL)lockBeforeDate:(NSDate *)limit
//在指定时间前尝试获取锁,若成功则返回YES 否则返回NO
2、– (void)lockWhenCondition:(NSInteger)condition
//尝试获取锁。在加锁成功前接收对象的Condition必须与参数Condition 相同
3、– (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit
//同上,只是又加上了一个时间
4、– (BOOL)tryLock //尝试着获取锁
5、– (BOOL)tryLockWhenCondition:(NSInteger)condition
//如果接收对象的condition与给定的condition相等,则尝试获取锁
6、– (void)unlockWithCondition:(NSInteger)condition
//解锁并设置接收对象的condition

NSCondition类 断言
//使线程等待
1、- (void)wait //阻塞当前线程,直到收到信号
2、- (BOOL)waitUntilDate:(NSDate *)limit
//阻塞当前线程,直到收到信号或到达指定时间

///发信号给阻塞的线程
1、- (void)signal //唤醒一个阻塞的线程
2、- (void)broadcast //唤醒所有阻塞的线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaiJunYa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值