美文网首页
2018 多线程

2018 多线程

作者: LeeDev | 来源:发表于2018-03-23 15:51 被阅读12次

    1. dispatch_async/dispatch_sync

    dispatch_sync: 同步/阻塞当前的线程 (当前的线程 可能是 主线程)
    dispatch_async: 分发出 的线程

    dispatch_sync dispatch_async dispatch_barrier_async
    串行队列 阻塞当前的线程(可能是主线程) 分发出 一个 新的线程(只有一个) dispatch_async 一样
    并发队列 阻塞当前的线程(可能是主线程) 每次调用会分发出新的线程 实现 单写 多读 ,当前任务中之后的任务会被阻塞
    多线程读写的时候
    1. 串行队列 不管读写都在串行队列中
     dispatch_queue_t syncQueue = dispatch_queue_create("com.syncQueue", NULL);
    
    - (NSString *)read {
    
        //当前的线程 比如 thread1 读取
        __block NSString * data = nil;
        //dispatch_sync: 同步/阻塞 `thread1` (假设是主线程 就是会阻塞主线程)
        dispatch_sync(syncQueue, ^{
            data = _data;
        });
        //还是在 thread1 返回
        return data;
    }
    
    - (void)write:(NSString *)data {
    
        //当前的线程 thread1
        //dispatch_sync, 阻塞或者同步 'thread1'
        dispatch_sync(syncQueue, ^{
    
            _data = data;
        });
    }
    
    // 这样 就能 保证 read 和 write 都是在 一个顺序 里面 . 
    // 假设 读 是任意线程 读取的, 那么 很 可能 在  `write` 中 , `read` 到的数据是没有`写好`的值 
    
    
    2. 并发队列 读写数据 ,可以 并发读 , 写的时候阻塞
    dispatch_queue_t currentQueue = dispatch_queue_create("com.currentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    - (NSString *)read {
    
        //当前的线程 比如 thread1 读取
        __block NSString * data = nil;
        //dispatch_sync: 同步/阻塞 `thread1` (假设是主线程 就是会阻塞主线程)
        dispatch_sync(currentQueue, ^{
            data = _data;
        });
        //还是在 thread1 返回
        return data;
    }
    
    - (void)write:(NSString *)data {
    
        //当前的线程 thread1
        //dispatch_barrier_async, 阻塞或者同步 currentQueue 中 的 某个最后的线程
        // dispatch_barrier_sync : 会阻塞 当前的线程
        dispatch_barrier_async(currentQueue, ^{
            _data = data;
        });
    }
    
    

    相关文章

      网友评论

          本文标题:2018 多线程

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