Objective c 中的等待和通知等效项

作者:编程家 分类: ios 时间:2025-11-26

Objective-C中的等待和通知等效项

在Objective-C中,我们经常需要处理多线程编程的情况。为了实现线程之间的协调和同步,我们可以使用等待和通知等效项。等待和通知等效项是一种设计模式,通过将线程阻塞直到某个条件满足,然后通知其他线程继续执行,来实现线程之间的同步。

等待和通知等效项的作用是允许多个线程在特定的条件满足前等待,然后在条件满足后通知其他线程继续执行。这种机制可以避免线程间的竞争条件,保证线程的安全性。

等待和通知等效项通常由两个关键类来实现:NSCondition和NSConditionLock。NSCondition是一个条件锁类,它提供了等待和通知的基本功能。NSConditionLock是NSCondition的子类,它在基本功能的基础上增加了多个条件的支持。

以下是一个使用NSCondition的简单示例:

objective-c

#import

@interface MyClass : NSObject

@property (nonatomic, strong) NSCondition *condition;

@end

@implementation MyClass

- (instancetype)init {

self = [super init];

if (self) {

self.condition = [[NSCondition alloc] init];

}

return self;

}

- (void)thread1 {

[self.condition lock];

// 等待条件满足

[self.condition wait];

NSLog(@"Thread 1: Condition satisfied");

[self.condition unlock];

}

- (void)thread2 {

[self.condition lock];

// 某个条件满足后发出通知

[self.condition signal];

NSLog(@"Thread 2: Condition signaled");

[self.condition unlock];

}

@end

int main(int argc, const char * argv[]) {

@autoreleasepool {

MyClass *myClass = [[MyClass alloc] init];

NSThread *thread1 = [[NSThread alloc] initWithTarget:myClass selector:@selector(thread1) object:nil];

NSThread *thread2 = [[NSThread alloc] initWithTarget:myClass selector:@selector(thread2) object:nil];

[thread1 start];

[thread2 start];

[thread1 join];

[thread2 join];

}

return 0;

}

上述代码中,我们创建了一个MyClass类,其中包含两个线程方法thread1和thread2。在thread1中,我们通过调用[self.condition wait]来等待条件满足。在thread2中,我们通过调用[self.condition signal]来发出通知。当条件满足时,thread1会继续执行并打印一条消息。

使用NSConditionLock实现多个条件的等待

除了NSCondition,我们还可以使用NSConditionLock来实现多个条件的等待。NSConditionLock是NSCondition的子类,它允许我们在等待条件时指定一个特定的条件值。以下是一个使用NSConditionLock的示例:

objective-c

#import

@interface MyClass : NSObject

@property (nonatomic, strong) NSConditionLock *conditionLock;

@end

@implementation MyClass

- (instancetype)init {

self = [super init];

if (self) {

self.conditionLock = [[NSConditionLock alloc] init];

}

return self;

}

- (void)thread1 {

[self.conditionLock lockWhenCondition:1];

// 等待条件1满足

NSLog(@"Thread 1: Condition 1 satisfied");

[self.conditionLock unlockWithCondition:2];

}

- (void)thread2 {

[self.conditionLock lockWhenCondition:2];

// 等待条件2满足

NSLog(@"Thread 2: Condition 2 satisfied");

[self.conditionLock unlockWithCondition:3];

}

- (void)thread3 {

[self.conditionLock lockWhenCondition:3];

// 等待条件3满足

NSLog(@"Thread 3: Condition 3 satisfied");

[self.conditionLock unlock];

}

@end

int main(int argc, const char * argv[]) {

@autoreleasepool {

MyClass *myClass = [[MyClass alloc] init];

NSThread *thread1 = [[NSThread alloc] initWithTarget:myClass selector:@selector(thread1) object:nil];

NSThread *thread2 = [[NSThread alloc] initWithTarget:myClass selector:@selector(thread2) object:nil];

NSThread *thread3 = [[NSThread alloc] initWithTarget:myClass selector:@selector(thread3) object:nil];

[thread1 start];

[thread2 start];

[thread3 start];

[thread1 join];

[thread2 join];

[thread3 join];

}

return 0;

}

在上述代码中,我们创建了一个MyClass类,其中包含三个线程方法thread1、thread2和thread3。每个线程方法在等待条件满足后打印一条消息,并使用[self.conditionLock unlockWithCondition:]来解锁并设置下一个等待的条件。通过这种方式,我们可以实现多个条件的等待和通知。

等待和通知等效项是Objective-C中处理多线程编程的有用工具。通过使用NSCondition和NSConditionLock等类,我们可以实现线程之间的协调和同步。这有助于避免竞争条件和提高程序的安全性。