NSCondition和NSConditionLock
来源:互联网 发布:华为整体网络解决方案 编辑:程序博客网 时间:2024/05/22 10:25
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:之后的代码。
- NSCondition和NSConditionLock
- IOS NSConditionLock 条件锁 NSCondition 断言
- IOS NSConditionLock 条件锁 NSCondition 断言
- IOS NSLocking协议,NSLock,NSConditionLock,NSRecursiveLock,NSCondition
- ios中的锁(Lock) NSLock,NSConditionLock,NSRecursiveLock,NSCondition
- 【NSCondition】
- NSCondition
- NSCondition
- iphone 线程同步和锁 NSCondition
- NSConditionLock使用方法
- IOS 多线程编程_NSLock,NSCondition,synchronized和生产者消费者模型
- 理解NSCondition
- NSCondition使用方法
- iOS NSCondition
- iOS NSCondition
- ios NSConditionLock 解释
- ios NSConditionLock 解释
- 使用 NSConditionLock 对象
- JS交互(js调oc,oc调js,js,oc互调,第三方库WebViewJavascriptBridge)
- FastDFS命令
- Spring-Task 创建定时任务
- React复合组件
- logback.xml 常用配置详解
- NSCondition和NSConditionLock
- FastDFS+Nginx安装配置笔记
- 如何提升销售培训工作的有效性?
- aidl的使用简介
- HDU 1203 I NEED A OFFER!
- iOS AppStore 申请加急审核
- Google推出iOS功能性UI测试框架EarlGrey
- 绑定型service
- linux-test测试