GCD队列queue.h__async/sync

队列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语言函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容