atomic跟nonatomic修饰词区别
if (!atomic) {
oldValue = *slot;
*slot = newValue;
} else {
spinlock_t& slotlock = PropertyLocks[slot];
slotlock.lock();
oldValue = *slot;
*slot = newValue;
slotlock.unlock();
}
从源码来看如果属性值是atomic,会使用自旋锁spinlock进行加锁解锁操作。
文件读写安全 IO操作
在文件操作中的原则是 "多读单写"原则,读取得是可以可以同时读取,写入的时候需要单独写入,而且不允许既有写的操作,又有读的操作
pthread_rwlock
使用方法该锁能保证读取得时候可以多个线程共同执行,写入的时候只能单个写入。
dispatch_barrier_async
栅栏函数:传入得队列必须是手动create创建的并发队列,不能是global或者串行队列,否则 会跟dispatch_async效果一样
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
//读
dispatch_async(queue, ^{
NSLog(@"read");
});
//写,传入得队列必须是手动create创建的,不能是global或者串行队列,会跟dispatch_async效果一样
dispatch_barrier_async(queue, ^{
NSLog(@"write");
});