@interface NSCondition : NSObject <NSLocking> {
@private
void *_priv;
}
//阻塞当前线程知道收到signaled信号,在调用这个方法之前必须调用lock方法
- (void)wait;
//阻塞当前线程知道收到signaled信号或到时,在调用这个方法之前必须调用lock方法
- (BOOL)waitUntilDate:(NSDate *)limit;
//发送信号,唤醒等待的线程;发送一次唤醒一个线程;
- (void)signal;
//广播信号,唤醒所有等待的线程
- (void)broadcast;
@property (nullable, copy) NSString *name NS_AVAILABLE(10_5, 2_0);
@end
eg:
NSCondition *lock = [NSCondition new];
//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[lock lock];
[lock wait];
NSLog(@"线程1");
NSLog(@"线程1解锁");
[lock unlock];
});
//线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[lock lock];
NSLog(@"线程2");
NSLog(@"线程2解锁");
[lock signal];
[lock unlock];
});
print:线程1必须等待信号后,才能执行
2019-12-03 10:47:46.781456+0800 Task[6337:432439] 线程2
2019-12-03 10:47:46.781857+0800 Task[6337:432439] 线程2解锁
2019-12-03 10:47:46.782155+0800 Task[6337:432438] 线程1
2019-12-03 10:47:49.787424+0800 Task[6337:432438] 线程1解锁