iOS atomic nonatomic 多读单写 文件读写安全 IO操作

atomic跟nonatomic修饰词区别

给属性原子性加上atomic,可以保证给属性的setter跟getter方法原子性操作,保证线程同步,比较消耗性能。
但是并不保证使用过程中线程同步,比如[self.data addObject:@"1"]
这种其实是调用data的getter方法之后再次进行操作,原子性操作在获取getter之后就已经停止工作。
源码可查看objc4-accessors.mm

    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");
    });
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,851评论 1 32
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 9,804评论 0 11
  • 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列...
    有梦想的老伯伯阅读 4,628评论 0 4
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 11,335评论 1 14
  • 初识 大约在我出生的时候家里就已经养有一只猫了,但是小时候的事情很多很多已经模糊不清了,关于这只猫的记忆都是后来在...
    麦田守望者lzu阅读 3,764评论 5 6