下面的代码有个问题,写的线程始终不会被调用,原因不明。。。除非把读的线程减少到一个
#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