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