NSCondition和NSConditionLock

NSCondition

@interface NSCondition : NSObject <NSLocking> {

@private

    void *_priv;

}


- (void)wait;//挂起线程

- (BOOL)waitUntilDate:(NSDate *)limit;

- (void)signal; //任意通知一个线程

- (void)broadcast; //通知所有等待的线程


@property (nullable,copy) NSString *nameNS_AVAILABLE(10_5,2_0);


@end


类似GCD的信号量,wait之后当前线程会被阻塞直到 lock signal。
在用的时候注意,首先对lock对象进行lock.

举例:

-(void)threadMethod:(NSCondition*)lock{

    [locklock];

    [lockwait];

    [lockunlock];


}

发布的时候:

[locklock];

                [lockbroadcast];

                [lockunlock];



代码演示:

- (void)executeLock {
    NSCondition* lock = [[NSCondition alloc] init];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (NSUInteger i=0; i<3; i++) {
            sleep(2);
            if (i == 2) {
                [lock lock];
                [lock broadcast];
                [lock unlock];
            }
            
        }
    });
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        [self threadMethod:lock];
    });
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        [self threadMethod:lock];
    });
    

}

-(void)threadMethod:(NSCondition*)lock{
    [lock lock];
    [lock wait];
    [lock unlock];

}

NSCondition实现了NSLocking协议,当多个线程访问同一段代码时,会以wait为分水岭。一个线程等待另一个线程unlock之后,在走wait之后的代码。

NSConditionLock:


@interface NSConditionLock :NSObject <NSLocking> {

@private

   void *_priv;

}


- (instancetype)initWithCondition:(NSInteger)conditionNS_DESIGNATED_INITIALIZER;


@property (readonly)NSInteger condition; //这属性非常重要,外部传入的condition与之相同才会获取到lock对象,反之阻塞当前线程,直到condition相同

- (void)lockWhenCondition:(NSInteger)condition; //condition与内部相同才会获取锁对象并立即返回,否则阻塞线程直到condition相同

- (BOOL)tryLock;//尝试获取锁对象,获取成功需要配对unlock

- (BOOL)tryLockWhenCondition:(NSInteger)condition; //同上

- (void)unlockWithCondition:(NSInteger)condition; //解锁,并且设置lock.condition = condition

- (BOOL)lockBeforeDate:(NSDate *)limit;

- (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit;


@property (nullable,copy) NSString *nameNS_AVAILABLE(10_5,2_0);


@end



代码实例:

- (void)executeLock {
    NSConditionLock* lock = [[NSConditionLock alloc] init];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (NSUInteger i=0; i<3; i++) {
            sleep(2);
            if (i == 2) {
                [lock lock];
                [lock unlockWithCondition:i];
            }
            
        }
    });
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        [self threadMethod:lock];
    });
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(1);
        [self threadMethod:lock];
    });
    

}

-(void)threadMethod:(NSConditionLock*)lock{
    [lock lockWhenCondition:2];
    [lock unlock];

}

NSConditionLock实现了NSLocking协议,一个线程会等待另一个线程unlock或者unlockWithCondition:之后再走lock或者lockWhenCondition:之后的代码。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值