您的位置:首页 > 移动开发 > IOS开发

iOS中的读写安全方案

2019-03-08 16:52 120 查看

iOS中的读写安全方案

  • 同一时间,只能有一个线程进行写操作
  • 同一时间,允许多个线程进行读操作
  • 同一时间,不允许既有写操作,又有读操作

方案一:
pthread_rwlock
读写锁

导入头文件

#import <pthread.h>

@property (assign, nonatomic) pthread_rwlock_t lock;

- (void)viewDidLoad {
[super viewDidLoad];

// 初始化锁
pthread_rwlock_init(&_lock, NULL);

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

for (int i = 0; i < 10; i++) {
dispatch_async(queue, ^{
[self read];
});
dispatch_async(queue, ^{
[self write];
});
}
}

- (void)read {
pthread_rwlock_rdlock(&_lock);

sleep(1);
NSLog(@"%s", __func__);

pthread_rwlock_unlock(&_lock);
}

- (void)write
{
pthread_rwlock_wrlock(&_lock);

sleep(1);
NSLog(@"%s", __func__);

pthread_rwlock_unlock(&_lock);
}

- (void)dealloc
{
pthread_rwlock_destroy(&_lock);
}

方案二:
dispatch_barrier_async
异步栅栏函数

- (void)viewDidLoad {
[super viewDidLoad];

self.queue = dispatch_queue_create("rw_queue", DISPATCH_QUEUE_CONCURRENT);

for (int i = 0; i < 10; i++) {
dispatch_async(self.queue, ^{
[self read];
});

dispatch_async(self.queue, ^{
[self read];
});

dispatch_async(self.queue, ^{
[self read];
});

dispatch_barrier_async(self.queue, ^{
[self write];
});
}
}

- (void)read {
sleep(1);
NSLog(@"read");
}

- (void)write
{
sleep(1);
NSLog(@"write");
}

注意:

dispatch_barrier_async
必须使用自己创建的并行队列才有效果。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐