GCD简析(同步、异步、串行、并行)

2024-06-18 21:48

本文主要是介绍GCD简析(同步、异步、串行、并行),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*
*
*需求规定:四个耗时任务A、B、C、D,要求先执行A,A执行完毕后才能开始B和C,但是B和C没有先后顺序,即并发执行,但是必须B和C都结束以后才能执行D。
*因为四个任务都是耗时任务,所以必须放入子线程中才行,否则会导致线程阻塞,又B和C并发执行,所以B和C是异步并发执行的任务。下面是具体代码。
*/

//对任务A创建一个SERIAL队列,即同时只执行一个任务
dispatch_queue_t aqueue = dispatch_queue_create("aqueue", DISPATCH_QUEUE_SERIAL);
//A任务采用异步线程执行
dispatch_async(aqueue, ^{
[NSThread sleepForTimeInterval:5];NSLog(@"A");
});
//因为B和C是并发进行的所以我们将B和C放到同一个队列,但是异步并发执行,因此用到了dispatch_group_t,并且要求全部使用dispatch_async执行
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(aqueue, ^{//任务组B、Cdispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"B");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"C");});//B、C都执行完毕后会通知dispatch_group_notify去执行Ddispatch_group_notify(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"D");});
});
/****当然我们也可以如下执行:即使用dispatch_barrier_async这个方法,在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行。这样就可以将A|BC|D这样分开执行,同时达到我们的要求*/
//这里一定要使用DISPATCH_QUEUE_CONCURRENT,如果使用DISPATCH_QUEUE_SERIAL就不会并发执行B和C,而是按照顺序B执行完才执行C最后是D,如果使用DISPATCH_QUEUE_PRIORITY_DEFAULT是不起作用的,因为DISPATCH_QUEUE_PRIORITY_DEFAULT是系统默认的线程即dispatch_get_global_queue管理方法,而我们这里是使用自定义线程。所以也不会按照我们的需求执行。
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
//A任务采用异步线程执行
dispatch_async(queue, ^{[NSThread sleepForTimeInterval:5];NSLog(@"A");
});
//dispatch_barrier_async执行任务
dispatch_barrier_async(queue, ^{dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"B");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"C");});//B、C都执行完毕后会通知dispatch_group_notify去执行Ddispatch_group_notify(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"D");});
});

这篇关于GCD简析(同步、异步、串行、并行)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073144

相关文章

时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位

NTP 是什么?   NTP 是网络时间协议(Network Time Protocol),它用来同步网络设备【如计算机、手机】的时间的协议。 NTP 实现什么目的?   目的很简单,就是为了提供准确时间。因为我们的手表、设备等,经常会时间跑着跑着就有误差,或快或慢的少几秒,时间长了甚至误差过分钟。 NTP 服务器列表 最常见、熟知的就是 www.pool.ntp.org/zo

GCD LCM

GCD(最大公约数) 欧几里得算法(辗转相除法) 原理 if(a%b==0) GCD=b else GCD=b%(a%b) 设 a ≥ b a\ge b a≥b: 若 a m o d b = = 0 a\mod b==0 amodb==0,则 g c d ( a , b ) = = b gcd(a,b)==b gcd(a,b)==b(整除性质); 若 a m o d b ! = 0 a

Linux-笔记 线程同步机制

目录 前言 实现 信号量(Semaphore) 计数型信号量 二值信号量  信号量的原语操作 无名信号量的操作函数 例子 互斥锁(mutex) 互斥锁的操作函数 例子 自旋锁 (Spinlock) 自旋锁与互斥锁的区别 自旋锁的操作函数 例子 前言         线程同步是为了对共享资源的访问进行保护,确保数据的一致性,由于进程中会有多个线程的存在,

java同步锁以及级别升级的理解

首先简单说下先偏向锁、轻量级锁、重量级锁三者各自的应用场景: 偏向锁:只有一个线程进入临界区;轻量级锁:多个线程交替进入临界区;重量级锁:多个线程同时进入临界区。 还要明确的是,偏向锁、轻量级锁都是JVM引入的锁优化手段,目的是降低线程同步的开销。比如以下的同步代码块:   synchronized (lockObject) { // do something } 上述同步代码块

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务,从而实现高效的并发。 关于“并发”和“并行”的区别,这是两个经常被提及但含义不同的概念: 并发(Concurrency):指的是同时处理多个任务的能力,这些任务可能在同一时

线程间通信方式(互斥(互斥锁)与同步(无名信号量、条件变量))

1通信机制:互斥与同步 线程的互斥通过线程的互斥锁完成; 线程的同步通过无名信号量或者条件变量完成。 2  互斥 2.1 何为互斥?         互斥是在多个线程在访问同一个全局变量的时候,先让这个线程争抢锁的资源,那个线程争抢到资源,它可以访问这个变量,没有争抢到资源的线程不能够访问这个变量。那这种只有一个线程能够访问到这个变量的现象称之为线程间互斥。 2.2互斥锁API 1.

FFplay源码分析-音视频同步2

《FFmpeg原理》的社群来了,想加入社群的朋友请购买 VIP 版,VIP 版有更高级的内容与答疑服务。 本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘 提取码:g3k8 FFplay 源码分析系列以一条简单的命令开始,ffplay -i a.mp4。a.mp4下载链接:百度网盘,提取码:nl0s 。 上一篇文章已经讲解完 音频播放线程函数 sdl_audio_c

玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)

关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?id=-1', //向后台传送id,获取根节点lines:true,onBeforeExpand:function(node,param){ $('#tree').tree('options'

【Python】 异步编程

【Python】 异步编程 1. nest_asyncio基础定义2. nest_asyncio 举例实现基本用法 1. nest_asyncio基础定义 nest_asyncio.apply() 是 Python 编程中与异步编程相关的一个调用,它用于解决某些特定环境下的异步编程问题。下面是对这个调用的详细解释: nest_asyncio 模块:这是一个第三方库,它提供

AJAX:如何编写一个关于AJAX的Hello World?(ajax发送异步请求(四步操作))

用到的一个Servlet类: package cn.edu.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;impor