读写安全

需求,多读单写,经常用于文件等数据的读写操作:

  1. 同一时间,只能有1条线程进行写的操作
  2. 同一时间,允许有多条线程进行读的操作
  3. 同一时间,不允许既有写的操作,又有读的操作

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的任务和其他任务不能同时执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值