对dispatch的一点理解

1. 队列和线程的关系

大家在很多地方都能看到这样的描述. 
```Object-c
// 创建并发队列, block 的内容会被分配到多个线程中
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
```

我认为这句话说对了一半. 队列本身并不具备开启线程的能力, 开启线程的是 `dispatch_async`. 
也就是说, 队列只是决定, 可不可以在多个线程中执行, 并不会开启线程, 
所以当并发队列, 遇上`dispatch_sync` 也不会在多个线程中执行

2. dispatch_async 和 dispatch_sync

相信大家对这个都很熟悉, 他俩有一个很重要的区别是会不会阻塞线程. 

3. 线程锁死

不要在主队列中使用 dispatch_async 切记!!!
`Object-c
  dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"%@", [NSThread currentThread]);
    NSLog(@"11111");
});
`
  • 如果当前在子线程中, 这样写没有问题, 回到主线程, 一切都很好, 但是 一定要保证是子线程
    在主线程中这样写就锁死了.原因是dispatch_sync这是一个函数会阻塞当前线程,只有收到这个函数的返回才会继续执行,dispatch_get_main_queue() 这句话说明当前block要在主线程中执行, 它会把block中添加到主线程任务中, 主线程的特性是顺序执行, 也就是要把已经添加的任务执行完毕后, 再执行block.于是dispatch_sync要等到block执行完成才会返回, 但是主线程要等到dispatch_sync返回才会执行block, 于是相互阻塞, 导致主线程被锁死.

5. dispatch_barrier_sync 和 dispatch_barrier_async

 先说dispatch_barrier_async 他会让 1. 他所在的队列 2. 比他先加入的block 先执行, 比他后加入的, 在他执行完后再执行. 他也是在子线程中执行.
 再说dispatch_barrier_sync, 这货管的有点宽.
1.不管是啥队列, 包括全局队列. 只要在他之前加入队列的就先执行, 在他之后加入的就等他执行完, 再执行. 
2. 注意: 他没有开线程, 不一定是在子线程中执行, 也可能是在主线程中执行. 
3. 这只是我测试的结果, 这个不太敢肯定, 你可以亲测一下. 

4. dispatch_queue_create 的参数.

DISPATCH_QUEUE_CONCURRENT, // 并发队列
DISPATCH_QUEUE_SERIAL  // 串行队列
但我想你还记得 
DISPATCH_QUEUE_PRIORITY_HIGH 2,优先级高
DISPATCH_QUEUE_PRIORITY_DEFAULT 0,默认优先级,中
DISPATCH_QUEUE_PRIORITY_LOW -2,优先级低
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN,后台模式,优先级最低
DISPATCH_QUEUE_CONCURRENT, DISPATCH_QUEUE_SERIAL 这两个是dispatch_queue_create的参数, 下面四个是 dispatch_get_global_queue的参数, 不要记混了. 

你可能感兴趣的:(多线程)