美文网首页
条件锁-NSCondition

条件锁-NSCondition

作者: 菠萝吹雪xs | 来源:发表于2021-03-19 17:04 被阅读0次

这里就单独说一下NSCondition
首先看一下条件锁的几个方法:

    NSCondition *codition=[[NSCondition alloc] init];
//    加锁,使用条件锁的时候要添加这句告诉线程我要上锁了
    [codition lock];
//    告诉当前线程等待,不再继续执行
    [codition wait];
//    告诉其他加条件锁的线程不用等待了,可以继续执行了
    [codition signal];
//    解锁,这个要和lock成对出现。很好理解,有加锁必有解锁
    [codition unlock];
    

下面我们写一个简单的程序来测试一下

//获取一个全局的并发队列
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        self.num=0;
        
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"队列1数字%ld---%@",(long)self.num,[NSThread currentThread]);      // 打印当前线程
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        self.num=2;

        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"队列2数字%ld---%@",(long)self.num,[NSThread currentThread]);      // 打印当前线程
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        self.num=3;

        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"队列3数字%ld---%@",(long)self.num,[NSThread currentThread]);      // 打印当前线程
    });

上面是三个并发队列,打印出来时无序的


image.png

现在我想让它按照2,1,3的顺序打印出来,就可以用到条件锁
下面来把代码稍微修改一下


//这里的代码是完整的,自己去声明一个num的整数类型,然后就可以复制下来,自定义一个方法,把它贴进去就可以测试了
    NSCondition *codition=[[NSCondition alloc] init];

    self.num=0;
    //获取一个全局的并发队列
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        [codition lock];
        while (self.num!=2) {
            [codition wait];
        }
        
        self.num=1;
        
        [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
        NSLog(@"队列1数字%ld---%@",(long)self.num,[NSThread currentThread]);      // 打印当前线程
        
        [codition signal];
        [codition unlock];
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        [codition lock];
        
        while (self.num==0) {
            self.num=2;

            [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
            NSLog(@"队列2数字%ld---%@",(long)self.num,[NSThread currentThread]);      // 打印当前线程
            
            [codition signal];
        }
        
        [codition wait];
        
        [codition unlock];
        
        
    });
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        [codition lock];
        
        while (self.num==1) {
            self.num=3;

            [NSThread sleepForTimeInterval:2];              // 模拟耗时操作
            NSLog(@"队列3数字%ld---%@",(long)self.num,[NSThread currentThread]);      // 打印当前线程
        }
        
        [codition wait];
        
        [codition unlock];
        
        
    });

然后运行打印,顺序正好是2,1,3.如果还有怀疑的话,可以多运行几次打印


image.png

上面有锁的代码是完整的,可以直接复制,demo我就不贴了。

如果你看了这篇文章也理解了话,就帮忙点个赞吧!

相关文章

网友评论

      本文标题:条件锁-NSCondition

      本文链接:https://www.haomeiwen.com/subject/ztvhfltx.html