美文网首页
GCD队列queue.h__async/sync

GCD队列queue.h__async/sync

作者: 悟2023 | 来源:发表于2018-01-08 11:58 被阅读24次

队列queue.h方法总览


queue.h

异步(async)同步(sync)相关方法:

一、dispatch_asyncdispatch_sync方法需要传二个参数,第一个参数是queue(队列),第二个参数是block(任务)dispatch_async是异步继续执行,不会阻塞当前调用的GCD线程,而dispatch_sync同步调用该GCD线程,会阻塞当前调用的GCD线程,直到block调用完结束。
二、方法名带后准_f的和不带后缀的运行意义完全一样,不同之处在于传入的参数不同。
三、方法名带_barrier和不带_barrier的区别体现在并发队列,让一些任务等待_barrier任务先执行或者后执行。

/**
 异步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param block 任务
 */
void
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
/**
 异步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param context 传递给work的任意类型(void *)参数
 @param work 执行的C语言函数名(函数指针)
 */
void
dispatch_async_f(dispatch_queue_t queue,
    void *_Nullable context,
    dispatch_function_t work);
/**
 同步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param block 任务
 */
void
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);
/**
 同步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param context 传递给work的任意类型(void *)参数
 @param work 执行的C语言函数名(函数指针)
 */
void
dispatch_sync_f(dispatch_queue_t queue,
    void *_Nullable context,
    dispatch_function_t work);
/**
 异步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param block 任务
 */
void
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
/**
 异步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param context 传递给work的任意类型(void *)参数
 @param work 执行的C语言函数名(函数指针)
 */
void
dispatch_barrier_async_f(dispatch_queue_t queue,
    void *_Nullable context,
    dispatch_function_t work);
/**
 同步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param block 任务
 */
void
dispatch_barrier_sync(dispatch_queue_t queue,
        DISPATCH_NOESCAPE dispatch_block_t block);
/**
 同步执行

 @param queue 提交到的队列(队列的类型决定了是串行还是并行执行队列中的任务)
 @param context 传递给work的任意类型(void *)参数
 @param work 执行的C语言函数名(函数指针)
 */
void
dispatch_barrier_sync_f(dispatch_queue_t queue,
    void *_Nullable context,
    dispatch_function_t work);

举例说明:
一、带后缀_f与不带后缀区别

int context = 10;
dispatch_async_f(dispatch_get_global_queue(0, 0), &context, logCount);
//C函数
void logCount(void* context) {
    int *c = context;
    NSLog(@"内存地址 === %p 值 === %d", &c,*c);
}

二、带_barrier和不带_barrier的区别

dispatch_queue_t queue = dispatch_queue_create("com.Maker", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^(){
    NSLog(@"任务_1");
});
dispatch_async(queue, ^(){
    NSLog(@"任务_2");
});
dispatch_async(queue, ^(){
    NSLog(@"任务_barrier");
});
dispatch_async(queue, ^(){
    NSLog(@"任务_3");
});
dispatch_async(queue, ^(){
    NSLog(@"任务_4");
});
/*
在并行队列中,dispatch_barrier_async 作用是会等待前面两个任务并行执行完成,
这里是并行输出 任务_1 / 任务_2 或者 任务_2 / 任务_1
然后执行
dispatch_barrier_async中的操作,等_barrier任务执行完成后,即输出 任务_barrier
最后并行队列恢复原有执行状态,继续并行执行,
这里是并行输出 任务_3 / 任务_4 或者 任务_4 / 任务_3

在串行队列中,还是串行执行。
*/

注意:带有后缀_f(比如dispatch_sync_fdispatch_async_f)就是提交给队列一个C语言函数。

相关文章

  • GCD队列queue.h__async/sync

    队列queue.h方法总览 异步(async)同步(sync)相关方法: 一、dispatch_async和dis...

  • iOS 网络开发

    多线程 NSThread GCD队列并发队列全局队列自己创建串行队列自己创建主队列任务:block函数sync:同...

  • 多线程与网络 - 概况

    多线程 NSThread GCD队列并发队列全局队列自己创建串行队列主队列自己创建任务:block函数sync:同...

  • iOS 基础网络篇

    多线程 NSThread GCD队列并发队列全局队列自己创建串行队列自己创建主队列任务:block函数sync:同...

  • GCD

    GCD 异步刷新屏幕在主队列中执行 dispatch_sync()锁死 在当前线程中调用dispatch_sync...

  • 我理解的GCD

    一、前期准备 GCD中有这么几个概念:同步派发sync、异步派发async、串行队列、并行队列。大家应该都听过这几...

  • GCD 知识总结

    (持续更新中~) GCD GCD中两个非常重要的概念: 任务 和 队列 任务分为同步执行sync和异步执行asyn...

  • 关于iOS 多线程有关知识

    多线程 GCD 1.任务和队列: 任务:要做什么,一段代码,在GCD中就是Block,任务有同步执行sync和异...

  • 同步串行导致的死锁问题

    GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁...

  • GCD的理解与应用

    一. GCD应用中主要分为函数和队列函数分为:同步函数,异步函数同步函数 dispatch_sync(dispat...

网友评论

      本文标题:GCD队列queue.h__async/sync

      本文链接:https://www.haomeiwen.com/subject/bovvnxtx.html