美文网首页面试题
iOS atomic nonatomic 多读单写 文件读写安全

iOS atomic nonatomic 多读单写 文件读写安全

作者: 咖啡豆8888 | 来源:发表于2018-12-12 14:18 被阅读13次

    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");
        });
    

    相关文章

      网友评论

        本文标题:iOS atomic nonatomic 多读单写 文件读写安全

        本文链接:https://www.haomeiwen.com/subject/msjehqtx.html