多线程的多读单写(保证读写安全)
2020-10-27 本文已影响0人
Jean_Lina
proxy:代理人,委托书
schedule:时间表
方案1:pthread_rwlock_rdlock、pthread_rwlock_wrlock
#import <pthread.h>
@property (nonatomic, assign) pthread_rwlock_t rwlock;
#pragma mark 锁的初始化
- (instancetype)init
{
self = [super init];
if (self) {
pthread_rwlock_init(&_rwlock, NULL);
}
return self;
}
#pragma mark 多线程调用
- (void)readAndWrite {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
[self read];
});
dispatch_async(queue, ^{
[self write];
});
dispatch_async(queue, ^{
[self write];
});
dispatch_async(queue, ^{
[self read];
});
dispatch_async(queue, ^{
[self read];
});
}
#pragma mark 读操作
- (void)read {
pthread_rwlock_rdlock(&_rwlock);
NSLog(@"%s", __func__);
pthread_rwlock_unlock(&_rwlock);
}
#pragma mark 写操作
- (void)write {
pthread_rwlock_wrlock(&_rwlock);
NSLog(@"%s", __func__);
sleep(4);
pthread_rwlock_unlock(&_rwlock);
}
#pragma mark 锁释放
- (void)dealloc
{
pthread_rwlock_destroy(&_rwlock);
}
方案2:dispatch_async 、dispatch_barrier_async
@property (nonatomic, strong) dispatch_queue_t queue;
- (instancetype)init
{
self = [super init];
if (self) {
self.queue = dispatch_queue_create("CONCURRENTQUEUE", DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
#pragma mark 多线程读写操作
- (void)readAndWrite {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
[self read];
});
dispatch_async(queue, ^{
[self write];
});
dispatch_async(queue, ^{
[self write];
});
dispatch_async(queue, ^{
[self write];
});
dispatch_async(queue, ^{
[self write];
});
}
#pragma mark 读操作
- (void)read {
dispatch_async(self.queue, ^{
NSLog(@"%s", __func__);
});
}
#pragma mark 写操作
- (void)write {
dispatch_barrier_async(self.queue, ^{
NSLog(@"%s", __func__);
sleep(4);
});
}