NSCondition实现生产者和消费者模式

#import "ShareResource.h"

@interface ShareResource ()
{
    BOOL _isEmpty;
    NSCondition *_condition;
}
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *gender;

@end

@implementation ShareResource

- (instancetype)init {
    self = [super init];
    if(self){
        _condition = [[NSCondition alloc] init];
        _isEmpty = YES;
    }
    return self;
}

- (void)save:(NSString *)name gender:(NSString *)gender {
    [_condition lock];//同步锁:加锁
    while(!_isEmpty){//这里用while比if更加安全
        [_condition wait];//让当前线程等待,直到被唤醒,调用此方法之前必须要先调用lock
    }
    self.name = name;
    [NSThread sleepForTimeInterval:0.005];
    self.gender = gender;
    _isEmpty = NO;
    [_condition signal];//发出信号,唤醒一个正在等待的线程。您可以使用该方法唤醒一个正在等待条件的线程。您可以多次调用这个方法来唤醒多个线程。如果没有线程在等待条件,这个方法就什么也不做。
    // broadcast:发出信号,唤醒所有等待它的线程。如果没有线程在等待条件,这个方法就什么也不做。
    [_condition unlock];//同步锁:解锁
}

- (void)get {
    [_condition lock];//同步锁:加锁
    while(_isEmpty){//这里用while比if更加安全
        [_condition wait];//让当前线程等待,直到被唤醒,调用此方法之前必须要先调用lock
    }
    [NSThread sleepForTimeInterval:0.005];
    NSLog(@"%@-----%@",self.name,self.gender);
    _isEmpty = YES;
    [_condition signal];
    [_condition unlock];//同步锁:解锁
}


@end
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容