iOS使用信号量实现读写者问题

下面的代码有个问题,写的线程始终不会被调用,原因不明。。。除非把读的线程减少到一个

#import "ViewController.h"

@interface ViewController (){
    dispatch_semaphore_t _mutex;
    int _count;
}
@property(strong,nonatomic) NSMutableArray* file;
@property(strong,nonatomic) NSLock *lock;
@end

@implementation ViewController
- (NSLock *)lock{
    if (_lock == nil) {
        _lock = [[NSLock alloc] init];
    }
    return _lock;
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    _mutex = dispatch_semaphore_create(1);
    self.file = [NSMutableArray arrayWithCapacity:10];
    dispatch_queue_t writeQueue = dispatch_queue_create("write", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (1) {
            [self readFile];
        }
    });
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (1) {
            [self readFile];
        }
    });
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (1) {
            [self readFile];
        }
    });
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (1) {
            [self readFile];
        }
    });
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        while (1) {
            [self readFile];
        }
    });
    dispatch_async(writeQueue, ^{
        while(1){
            [self writeFile];
        }
    });
}


-(void)readFile{
    [self.lock lock];
    if (_count == 0) {
        dispatch_semaphore_wait(_mutex, DISPATCH_TIME_FOREVER);
    }
    _count++;
    [self.lock unlock];
    
    [self read];
    
    [self.lock lock];
    _count--;
    if (_count == 0) {
        dispatch_semaphore_signal(_mutex);
    }
    [self.lock unlock];
}

-(void)writeFile{
    dispatch_semaphore_wait(_mutex, DISPATCH_TIME_FOREVER);
    [self write];
    dispatch_semaphore_signal(_mutex);
}

- (void)read{
    [NSThread sleepForTimeInterval:2.0];
    NSLog(@"读:%@",[NSThread currentThread]);
    for (NSString *str in self.file) {
        NSLog(@"%@",str);
    }
    [NSThread sleepForTimeInterval:2.0];
}

- (void)write{
    [NSThread sleepForTimeInterval:0.5];
    NSLog(@"写:%@",[NSThread currentThread]);
    [self.file addObject:[NSString stringWithFormat:@"write:%lu",self.file.count]];
    [NSThread sleepForTimeInterval:0.5];
}

@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值