需求,多读单写,经常用于文件等数据的读写操作:
- 同一时间,只能有1条线程进行写的操作
- 同一时间,允许有多条线程进行读的操作
- 同一时间,不允许既有写的操作,又有读的操作
pthread_rwlock
示例代码:
#import <pthread.h>
@property (nonatomic, assign) pthread_rwlock_t rwlock;
// 1. 初始化
pthread_rwlock_init(&_rwlock, NULL);
// 2. 加锁解锁
- (void)read {
pthread_rwlock_rdlock(&_rwlock);
sleep(2);
NSLog(@"%s", __func__);
pthread_rwlock_unlock(&_rwlock);
}
- (void)write {
pthread_rwlock_wrlock(&_rwlock);
sleep(2);
NSLog(@"%s", __func__);
pthread_rwlock_unlock(&_rwlock);
}
// 3. 释放资源
pthread_rwlock_destroy(&_rwlock);
运行结果:
2019-10-23 12:11:51.100854+0800 多线程[1273:38916] -[RWLockModel write]
2019-10-23 12:11:53.106104+0800 多线程[1273:38915] -[RWLockModel read]
2019-10-23 12:11:55.111689+0800 多线程[1273:38918] -[RWLockModel write]
2019-10-23 12:11:57.117394+0800 多线程[1273:38919] -[RWLockModel read]
2019-10-23 12:11:59.122995+0800 多线程[1273:38920] -[RWLockModel write]
2019-10-23 12:12:01.125582+0800 多线程[1273:38921] -[RWLockModel read]
2019-10-23 12:12:03.129578+0800 多线程[1273:38922] -[RWLockModel write]
2019-10-23 12:12:05.134669+0800 多线程[1273:38925] -[RWLockModel read]
2019-10-23 12:12:05.134669+0800 多线程[1273:38929] -[RWLockModel read]
2019-10-23 12:12:05.134674+0800 多线程[1273:38923] -[RWLockModel read]
2019-10-23 12:12:05.134674+0800 多线程[1273:38931] -[RWLockModel read]
2019-10-23 12:12:07.140036+0800 多线程[1273:38934] -[RWLockModel write]
2019-10-23 12:12:09.145648+0800 多线程[1273:38933] -[RWLockModel read]
2019-10-23 12:12:09.145648+0800 多线程[1273:38917] -[RWLockModel read]
2019-10-23 12:12:11.146148+0800 多线程[1273:38924] -[RWLockModel write]
2019-10-23 12:12:13.148300+0800 多线程[1273:38926] -[RWLockModel write]
2019-10-23 12:12:15.154080+0800 多线程[1273:38927] -[RWLockModel read]
2019-10-23 12:12:17.156968+0800 多线程[1273:38928] -[RWLockModel write]
2019-10-23 12:12:19.160653+0800 多线程[1273:38930] -[RWLockModel write]
2019-10-23 12:12:21.163642+0800 多线程[1273:38932] -[RWLockModel write]
从运行结果中可以看出:
- read任务可以同时进行多个
- write任务只能同时进行单个
dispatch_barrier_async
- 这个方法传入的队列必须是通过dispatch_queue_create创建的并发队列
- 如果传入的是串行或全局队列,那么这个方法等同于dispatch_async方法的效果
示例代码:
// 1. 初始化队列
dispatch_queue_t queue = dispatch_queue_create("queue_label", DISPATCH_QUEUE_CONCURRENT);
// 2. 读
dispatch_async(queue, ^{
});
// 3. 写
dispatch_barrier_async(queue, ^{
});
dispatch_barrier_async会将其中的任务与其他任务隔离,即:
- 同一时间只能执行单个dispatch_barrier_async的任务
- 同一时间可以执行多个其他任务
- dispatch_barrier_async的任务和其他任务不能同时执行