GCD之dispatch_set_target_queue

序言:dispatch_queue_create函数生成的dispatch queue不管是serial 还是concurrent,都使用与默认优先级Global Dispatch Queue相同的执行优先级。而要变更生成的dispatch queue的执行优先级要使用dispatch_set_target_queue函数。

Snip20170510_1.png

注意:如果第一个参数不能指定为是系统提供的Main dispatch queue或者Global dispatch queue;

  • 该函数还有一个重要的作用就是可以改变dispatch queue的执行阶层。

在必须将不可并行执行的处理追加到多个serial dispatch queue中时,如果使用dispatch_set_target_queue函数将目标指定为某一个serial dispatch queue,即可防止处理并行执行。

{
    //目标队列
    dispatch_queue_t targetQueue = dispatch_queue_create("target", DISPATCH_QUEUE_SERIAL);
        //可以并发执行的串行队列
    dispatch_queue_t q1 = dispatch_queue_create("x", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q2 = dispatch_queue_create("xx", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t q3 = dispatch_queue_create("xxx", DISPATCH_QUEUE_SERIAL);
        //指定目标队列
    dispatch_set_target_queue(q1, targetQueue);
    dispatch_set_target_queue(q2, targetQueue);
    dispatch_set_target_queue(q3, targetQueue);
    
    
    dispatch_async(q1, ^{
      //code
    });
        dispatch_async(q2, ^{
       //code
    });
    dispatch_async(q3, ^{
       //code
    });
}

注意:
serial disPatch queue是一个串行队列,只能同时执行1个追加处理(即任务),当用dispatch_queue_create函数生成多个serial disPatch queue时,每个serial disPatch queue均获得一个线程,即多个serial disPatch queue可并发执行,同时处理添加到各个serial disPatch queue中的任务,但要注意如果过多地使用多线程,就会消耗大量内存,引起大量的上下文切换,大幅度降低系统的响应性能,所以我们只在为了避免多个线程更新相同资源导致数据竞争时,使用serial disPatch queue

你可能感兴趣的:(GCD之dispatch_set_target_queue)