您的位置:首页 > 其它

NSCondition和NSConditionLock

2016-02-22 17:44 387 查看

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:之后的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: