2018 多线程

2018-03-23  本文已影响12人  LeeDev

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

上一篇下一篇

猜你喜欢

热点阅读