IOS GCD多线程介绍

时间:2022-01-26 16:00:32

GCD:是纯C语言写的,是苹果公司为多核的并行运算提出的解决方案。
GCD的两个核心概念:
- 任务
- 队列
将任务添加到队列中
GCD会自动将队列中的任务取出,放到对应的线程中执行
任务的取出遵循队列的FIFO原则:先进先出,后进后出

  • 创建串行队列
// "WE" 为线程的名称
// DISPATCH_QUEUE_SERIAL 串行
dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
// 也可以这样设置 串行默认为NULL
dispatch_queue_t queue = dispatch_queue_create("WE", NULL);
  • 创建并行队列
//DISPATCH_QUEUE_CONCURRENT 并行
dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
  • 异步执行
dispatch_async(queue, ^{
// 
});
  • 同步执行
dispatch_sync(queue, ^{
//
});

GCD的几种用法
- 串行队列,同步执行—–不开线程,同步执行

    dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
    for (int i = 0; i < 5; ++i) {
        // 同步执行
        dispatch_sync(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
    }
  • 串行队列,异步执行—–开一个线程,顺序执行
    dispatch_queue_t queue = dispatch_queue_create("WE",DISPATCH_QUEUE_SERIAL);
    for (int i = 0; i < 5; ++i) {
        // 异步执行
        dispatch_async(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
    }
  • 并行队列,异步执行—–开多个线程,异步执行
    dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);

    for (int i = 0; i < 10; ++i) {
// // 异步执行
        dispatch_async(queue, ^{
            NSLog(@"异步>%d--%@",i,[NSThread currentThread]);
        });
    }
  • 并行队列,同步执行—–不开线程,顺序执行
    dispatch_queue_t queue = dispatch_queue_create("WE", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0; i < 10; ++i) {
        // 同步执行
        dispatch_sync(queue, ^{
            NSLog(@"同步>%d--%@",i,[NSThread currentThread]);
        });
    }
  • 主队列,异步任务—–不开线程,同步执行
    dispatch_queue_t queue = dispatch_get_main_queue();
    for (int i = 0; i < 5; ++i) {
        // // 异步执行
        dispatch_async(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
    }
  • 主队列,同步执行—–程序执行不出来(死锁)
    死锁的原因,当程序执行到下面这段代码的时候
    1) 主队列:如果主线程正在执行代码,就不调度任务
    2) 同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务,此时互相等待,程序无法往下执行(死锁)

  • 全局队列(本质就是并发队列)

//第一个参数:iOS7和iOS8中适配此参数 可以直接传入0
//第二个参数:为将来保留使用,始终传入0
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    for (int i = 0; i < 5; ++i) {
        // 并行执行
        dispatch_async(queue, ^{
            NSLog(@"%d--%@",i,[NSThread currentThread]);
        });
    }