线程的同步、异步、串行、并行的关系

从零开始:在Windows WSL中搭建Openfoam7+blastfoam2.0.0开发环境(避坑大全) 本文详细指导在Windows WSL中搭建OpenFOAM 7与BlastFOAM 2.0.0开发环境,重点解析了安装过程中的常见“坑点”,如编译模式不匹配导致的符号错误,并提供了从系统准备、软件部署到环境验证的完整解决方案,帮助开发者高效构建CFD与爆炸模拟开发平台。 阅读详情

程序是由什么构成的,可能有的人会说,它是有一个个字符和逻辑共同构成的,这个说法并不完全。

程序在没有运行的状态下,是一堆代码构成的。

运行的程序是由进程程构成的,进程是程序执行的基本单位。对于进程,它可以又多个不同的线程共同构成,线程在程序中是如何运行的,他们运行的方式和关系。



    同步执行和异步执行、串行队列和并发队列的核心是:任务和队列。

    任务:就是执行操作,换句话说就是你在线程中执行的那段代码。

同步执行:

  •  同步执行(Sync):

       1) 同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再

        2)只能在当前线程中执行任务,不具备开启新线程的能力
  • 异步执行(Async):

        1)异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务      

         2)可以在新的线程中执行任务,具备开启新线程的能力。












同步执行和异步执行、串行队列和并发队列的核心是:任务和队列。

        1)同步执行和异步执行的核心: 任务

                区别: 是否等待队列的任务执行结束,以及是否具备开启新线程的能力

        串行队列和并发队列的核心: 队列

               相同: 串行队列和并发队列都符合FIFO(先进先出)的原则。

               区别: 执行的顺序不同,以及开启的线程数不同


(备注:并发队列的并发功能只能在异步函数下才有效)

下边使用OC中的GCD来展示以下四种组合出现的情况:

    1.同步执行 + 串行队列:

    2.异步执行 + 串行队列:

    3.同步执行 + 并发队列:

    4.异步执行 + 并发队列:


1.同步执行 + 串行队列:


//同步执行 + 串行队列
-(void)syncSerial{
    NSLog(@"CurrentThread ------%@",[NSThread currentThread]);
    NSLog(@"syncSerial------Begin");
    
    dispatch_queue_t queue = dispatch_queue_create("SerialTest", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        // 添加任务1
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"1----------%@", [NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        // 添加任务2
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"2----------%@", [NSThread currentThread]);
        }
    });
    
    dispatch_sync(queue, ^{
        // 添加任务3
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3----------%@", [NSThread currentThread]);
        }
    });
    NSLog(@"syncSerial------------end");
}

执行结果:            

2018-03-21 10:57:36.273782+0800 ThreadTest[2057:2142420] CurrentThread ------<NSThread: 0x604000078fc0>{number = 1, name = main}
2018-03-21 10:57:36.273961+0800 ThreadTest[2057:2142420] syncSerial------Begin
2018-03-21 10:57:38.274892+0800 ThreadTest[2057:2142420] 1----------<NSThread: 0x604000078fc0>{number = 1, name = main}
2018-03-21 10:57:40.275845+0800 ThreadTest[2057:2142420] 1----------<NSThread: 0x604000078fc0>{number = 1, name = main}
2018-03-21 10:57:42.277407+0800 ThreadTest[2057:2142420] 2----------<NSThread: 0x604000078fc0>{number = 1, name = main}
2018-03-21 10:57:44.278935+0800 ThreadTest[2057:2142420] 2----------<NSThread: 0x604000078fc0>{number = 1, name = main}
2018-03-21 10:57:46.279713+0800 ThreadTest[2057:2142420] 3----------<NSThread: 0x604000078fc0>{number = 1, name = main}
2018-03-21 10:57:48.281338+0800 ThreadTest[2057:2142420] 3----------<NSThread: 0x604000078fc0>{number = 1, name = main}
2018-03-21 10:57:48.281630+0800 ThreadTest[2057:2142420] syncSerial------------end

2.异步执行 + 串行队列:


// 异步并发 + 串行队列
-(void)asyncSerial{
    NSLog(@"Current Thread:-------%@",[NSThread currentThread]);
    NSLog(@"asyncSerial--------begin");
    
    dispatch_queue_t queue = dispatch_queue_create("asyncSerialTest", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        // 添加任务1
        for (int i = 0; i < 2 ; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"1--------------%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        // 添加任务2
        for (int i = 0; i < 2 ; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"2--------------%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        // 添加任务3
        for (int i = 0; i < 2 ; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3--------------%@",[NSThread currentThread]);
        }
    });
}

执行结果:
2018-03-21 11:01:03.131755+0800 ThreadTest[2172:2144740] Current Thread:-------<NSThread: 0x60400006f500>{number = 1, name = main}
2018-03-21 11:01:03.131923+0800 ThreadTest[2172:2144740] asyncSerial--------begin
2018-03-21 11:01:05.135621+0800 ThreadTest[2172:2144804] 1--------------<NSThread: 0x604000279bc0>{number = 3, name = (null)}
2018-03-21 11:01:07.137982+0800 ThreadTest[2172:2144804] 1--------------<NSThread: 0x604000279bc0>{number = 3, name = (null)}
2018-03-21 11:01:09.143012+0800 ThreadTest[2172:2144804] 2--------------<NSThread: 0x604000279bc0>{number = 3, name = (null)}
2018-03-21 11:01:11.146212+0800 ThreadTest[2172:2144804] 2--------------<NSThread: 0x604000279bc0>{number = 3, name = (null)}
2018-03-21 11:01:13.147072+0800 ThreadTest[2172:2144804] 3--------------<NSThread: 0x604000279bc0>{number = 3, name = (null)}
2018-03-21 11:01:15.151203+0800 ThreadTest[2172:2144804] 3--------------<NSThread: 0x604000279bc0>{number = 3, name = (null)}
3.同步执行 + 并发队列:
// 同步执行 + 并发队列
//
-(void)syncConcurrent{
    NSLog(@"currentThread-----%@",[NSThread currentThread]);
    NSLog(@"syncConcurrent----begin");
    
    // 创建一个并发队列
    dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
    
    //并发队列中  添加 同步执行任务
    dispatch_sync(queue, ^{
        // 追加任务1
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:1];
            NSLog(@"1-------%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        // 追加任务2
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:1];
            NSLog(@"2--------%@",[NSThread currentThread]);
        }
    });
    dispatch_sync(queue, ^{
        // 追加任务3
        for (int i = 0; i < 2; ++i) {
            [NSThread sleepForTimeInterval:1];
            NSLog(@"3---------%@", [NSThread currentThread]);
        }
    });
    NSLog(@"syncConcurrent -------- end");
}
执行结果:
2018-03-21 11:02:20.648393+0800 ThreadTest[2227:2145966] currentThread-----<NSThread: 0x600000076b80>{number = 1, name = main}
2018-03-21 11:02:20.648628+0800 ThreadTest[2227:2145966] syncConcurrent----begin
2018-03-21 11:02:21.649938+0800 ThreadTest[2227:2145966] 1-------<NSThread: 0x600000076b80>{number = 1, name = main}
2018-03-21 11:02:22.650266+0800 ThreadTest[2227:2145966] 1-------<NSThread: 0x600000076b80>{number = 1, name = main}
2018-03-21 11:02:23.650869+0800 ThreadTest[2227:2145966] 2--------<NSThread: 0x600000076b80>{number = 1, name = main}
2018-03-21 11:02:24.651351+0800 ThreadTest[2227:2145966] 2--------<NSThread: 0x600000076b80>{number = 1, name = main}
2018-03-21 11:02:25.652397+0800 ThreadTest[2227:2145966] 3---------<NSThread: 0x600000076b80>{number = 1, name = main}
2018-03-21 11:02:26.653781+0800 ThreadTest[2227:2145966] 3---------<NSThread: 0x600000076b80>{number = 1, name = main}
2018-03-21 11:02:26.654109+0800 ThreadTest[2227:2145966] syncConcurrent -------- end


4.异步执行 + 并发队列:
// 异步执行 + 并发队列
//特点:
-(void)asyncConcurrent{
    NSLog(@"asyncConcurrent ----%@ ",[NSThread currentThread]);
    NSLog(@"AsyncConcurrent----begin");
    
    // 创建并发队列
    dispatch_queue_t quenue = dispatch_queue_create("quenueTest", DISPATCH_QUEUE_CONCURRENT);
    
    // 并发队列中添加异步执行任务
    dispatch_async(quenue, ^{
        //追加任务1
        for (int i = 0; i<2; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"1---------%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(quenue, ^{
        //追加任务2
        for (int i = 0; i<2; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"2---------%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(quenue, ^{
        //追加任务3
        for (int i = 0; i<2; ++i) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3---------%@",[NSThread currentThread]);
        }
    });
}
执行结果:
2018-03-21 11:03:24.971218+0800 ThreadTest[2278:2147177] asyncConcurrent ----<NSThread: 0x604000073740>{number = 1, name = main}
2018-03-21 11:03:24.971412+0800 ThreadTest[2278:2147177] AsyncConcurrent----begin
2018-03-21 11:03:26.976195+0800 ThreadTest[2278:2147265] 3---------<NSThread: 0x604000271480>{number = 4, name = (null)}
2018-03-21 11:03:26.976195+0800 ThreadTest[2278:2147267] 1---------<NSThread: 0x604000268f40>{number = 3, name = (null)}
2018-03-21 11:03:26.976225+0800 ThreadTest[2278:2147266] 2---------<NSThread: 0x604000271500>{number = 5, name = (null)}
2018-03-21 11:03:28.980970+0800 ThreadTest[2278:2147266] 2---------<NSThread: 0x604000271500>{number = 5, name = (null)}
2018-03-21 11:03:28.980980+0800 ThreadTest[2278:2147267] 1---------<NSThread: 0x604000268f40>{number = 3, name = (null)}
2018-03-21 11:03:28.980987+0800 ThreadTest[2278:2147265] 3---------<NSThread: 0x604000271480>{number = 4, name = (null)}

线程:

时间:线程在时间上可以分为“串行” 和“并发”两种方式,同步就是让我们的线程同时执行,异步线程不同时执行。强调时间性。

关系:线程在线程之间关系上可以分为“顺序执行”和“并行执行”,强调的是线程之间的关系。


线程在执行的过程中,线程可以分为四种:

同步执行 + 串行队列:我们把任务分配一个个线程,每个线程的任务都在主线程中执行。

异步执行 + 串行队列:队列中的任务顺序执行:在子线程中执行,主线程继续,不会等待子线程执行完毕。

同步执行 + 并发队列:(一般不用):队列中任务顺序执行,在主线程中执行(并行)

异步执行 + 并发队列:队列中的任务同时执行;在子线程中执行;主线程继续执行,不会等待子线程执行完毕。


线程同步和异步之间的关系

同步:多个线程在同一时间同时执行。

异步:多个线程在不同时间被执行。

在多线程的执行过程中,线程之间的数据的传递、共享会存在已写小的问题,我们需要对线程进行加锁/解锁操作,对线程进行操作,达到对程序设计的目标。


每个运行中的程序都对应一个进程,每个进程可能可能由多个线程共同组成。


电芯外观及体系设计(Cell Design)-①容量平衡设计(Cell Balance Design) 全面获取并正确解读客户需求,将需求进行分解和预判,结合公司现有资源、技术,给出设计方案。一个优秀的电芯设计方案,应该是稳健的,可操作的,满足客户需求的同时,并能为公司带来较多利润。电芯设计需同时考虑周期,性能,品质,加工性,成本,及安全与稳健性。设计人员时刻要有成本控制观念,但利润则是由公司战略所决定。 阅读详情

相关推荐

【原创】Ubuntu20.04 安装 Isaac Gym 仿真器

Ubuntu20.04 安装 Isaac Gym

qq_54900679的博客 3092

多线程基础

什么是线程1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)一个进程(程序)的所有任务都在线程中执行 1个线程中任务的执行是串行的如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务也就是说,在同一时间内,1个线程只能执行1个任务 进程和线程的比较 1.线程是CPU调用(执行任务)的最小单位。 2.进程是CPU分

qq_30997845的博客 329

[SV]SystemVerilog状态机实现案例

本文介绍了SystemVerilog中状态机的实现方法。首先使用枚举类型定义状态(TOP_HIB、TOP_BG、TOP_LDO、TOP_NOR),然后通过三个主要任务实现状态机:1)格式化现态寄存器处理状态转换;2)描述状态转移条件,包括计时器和稳定时间判断;3)基于当前状态和输入信号确定次态。状态机在时钟边沿或复位时更新状态,实现了从休眠到正常工作状态的转换逻辑,包含电源稳定时间检测等关键功能。

元直的博客 2020

线程的并行与串行

1.串行Sequential:一个一个完成任务,先做任务A,完成后,再做任务B。。。。更耗时 2.并发Concurrent:先做任务A,当A在等待的时候,开启任务B,以此类推,也就是说这三个任务交替完成 3.并行Parallel:三个任务同时开始,总耗时取决于需要时间最长的那个任务。 4.并发可以提高事务的处理效率,即一段时间内可以处理或者完成更多的事情。 5.并行是一种更为严格、理想的并发 6.从硬件角度来说,如果单核cpu,一个处理器一次只能执行一个线程的情况下,处理器可以使用时间片轮转技术,可以让CP

m0_46261647的博客 766

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2131

编织数据的实时脉络——构建基于MySQL的数据编织平台,实现实时数据治理

除了上述基本设置外,我们还可以根据实际应用场景自定义一些特定的监控项目。例如,对于某些高并发读写的表,可能需要特别关注它们的锁等待时间和回滚段使用率;而对于涉及到跨库关联查询的操作,则应当着重检查网络延迟及缓存命中率等因素。-- 获取InnoDB行级锁等待情况-- 统计各表的缓存命中率这段SQL脚本不仅展示了如何查询InnoDB引擎下的锁争用状况,还介绍了计算表级别缓存命中率的方法,有助于深入理解系统的运行状态。

墨夶的博客 1789

线程中同步、异步、串行、并行

从线程的时效来看分别同步和异步 从线程的执行来看线程队列分为串行队列和并行队列从线程的时效来看,分别同步和异步 同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,程序也不会接着往下执行。按照这个定义,其实绝大多数函数都是同步调用。 异步:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调(Handler机制)来通知调

余杭探险家 8591

Python - 多页pdf 合称为一页

尝试使用 ReportLab 来重画 pdf,但探索起来有点麻烦。重要的是解决手头这个问题,所以就算方法蠢,但简单完事。以下生成结果,最有一页 pdf 可能会显示在第一页,手动编辑下 pdf 即可;或者你也可以修改代码逻辑来完善。打印ppt,一页占用A4纸比较浪费,想多页合成一个 A4大小;安装 fitz,单独安装 fitz 使用可能会报错。将 PDF 拆分为 图片来保存。

AI工程化、开源分享、文档翻译、代码笔记 1425

多线程基础:并发,并行和 串行

并发和并行 线程和进程 线程的调度 分时调度 抢占式调度 主线程 执行主方法(main)的线程

qq_39654399的博客 1452

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 111

【STM32项目】基于Stm32c8t6-镭射激光打印机的设计(完整工程资料源码)

随着打印技术的快速发展,镭射打印技术也开始得到越来越广泛的应用。这种技术可以被用于在木材、塑料、皮革、织物等各种材料上进行图形打印,并且通常比传统机器更快、更准确和更灵活。

嵌入式技术开发 7199

(1)线程学习笔记

线程学习笔记

waooi的博客 997

【AirPlay】苹果认证MFI学习

配件认证是一个过程,通过这个过程,可验证其配件符合MFi技术规范,并通过苹果指定的任何认证测试。MFi门户中的产品计划 "认证 "页面将指导你完成特定配件所需的认证步骤,并指出何时完成所有要求。在完成所有MFi认证要求之前,你不得制造、分发或销售任何配件。在开始MFi认证过程之前,你必须测试你的配件,以确保它符合最新的MFi技术规范,通过产品计划 "测试计划 "上的所有适用测试,并与它将声称具有兼容性的每个苹果设备兼容。

天天的博客 2275

【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)...

API-https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/doc/uid/TP40008079 一、同步、异步和串行、并行 任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可...

weixin_30908103的博客 275

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

死锁及线程与队列之间的等待关系

上面这几个例子可以很好的帮助理解线程队列以及任务同步和异步之间的关系,不必去死记这几这者间排列组合的结果;

m0_74217598的博客 1402

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

(1)GCD实现的同步异步、串行并行。 ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时间的任务 [objc] view plain copy /**   *  因为是异步,所以开通了子线程,但是因为是串行队列,所以只需要开通1个子线程(2),它们在子线程中顺序执行。最常用。   */   -(vo

Bob的专栏 1518

iOS多线程并发,串行,同步,异步

好久没写过博客,回顾之前还是编程初期的那几篇,不想多年之后在iOS圈子里悄悄的来,又悄悄的走.所以又捡起博客,以后会定期分享自己的学习心得.           废话不多说,上今天的菜           我们先讲几个概念,也是面试会经常问到的. 同步线程:同步线程会阻塞当前线程去执行线程内的任务,执行完之后才会反回当前线程。异步线程:异步线程不会阻塞当前线程,会开启其他线程去执行线

wyk2021的博客 532

串行,并行,并发,阻塞,非阻塞易混淆概念

目录 1 串行,并行,并发 2 同步和异步 3 阻塞和非阻塞: 4 进程和线程的关系:

路在脚下 716

多线程篇-1--入门概念(进程,线程,并行,并发,同步,异步等理解)

串行,即同一时间内仅1个人干活;适用于简单的任务和有严格依赖关系的任务。并行,即同一时间内有多个人干活;适用于计算密集型任务且任务没有严格的依赖关系。并发,即每个人来回切换者活干(可以是串行,也可以并行)。适用于需要提高系统响应性和效率的场景,可以在单处理器或多处理器上实现。

weisian的博客 3万+

Python入门【串行、并行与并发的区别、 进程、线程、协程的区别、线程是什么? 、协程是什么?、同步和异步介绍、线程Thread 、守护线程】(二十三)

Python入门【串行、并行与并发的区别、进程、线程、协程的区别、线程是什么?、协程是什么?、同步和异步介绍、线程Thread、守护线程】(二十三)

abc19991119的博客 916

同步异步 串行 并行

同步、异步: 指的是能否开启新的线程。同步不能开启新的线程,异步可以。 串行、并行: 指的是任务的执行方式。串行是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个。并行指的是多个任务可以同时执行。异步是多个任务并行的前提条件。

Cola 404

线程和线程池 详细讲解

物理CPU、核 和 线程之间的关系 物理CPU:是指硬件的核心数,指这台计算机有两个CPU。 逻辑CPU:是逻辑上的,简单理解为在逻辑上模拟出来的核心数,即效果是 物理1个CPU 模拟出逻辑CPU,上图中是一个CPU模拟出两个,相当于两个CPU的效果。 CPU程数:是指在同一时刻设备能并行执行的线程数, 线程数=物理CPU * 逻辑CPU。即代表在此时此刻这个时间点,可...

dieyu2828的博客 327

iOS多线程——同步异步串行并行

串行并行异步同步的概念很容易让人混淆,关于这几个概念我在第一篇GCD中有解释,但是还不够清晰,所以这里重写一篇博客专门对这几个概念进行区分: 先说一下队列和任务: (1)队列分为串行和并行,任务的执行分为同步和异步,异步是多线程的代名词,异步在实际引用中会开启新的线程,执行耗时操作。 (2)队列只是负责任务的调度,而不负责任务的执行,任务是在线程中执行。 以上两点对了解串行、并行、同步、异...

weixin_33910759的博客 157

并发并行,同步异步怎么搞?

操作系统有三大特性: 1.并发 2.共享 3.异步 1.谈到并发,就不得不提串行和并行了。这三点容易混淆。 如下图所示, 串行:一个时间段内,执行一个任务的同时不能执行其他任务,只能等到第一个任务完成后才能进行第二个。 并行:一个时间段内有多个任务,可以同时运行两个或多个任务。 并发:一个时间段中有几个任务都处于已启动运行到运行完毕之间,且这几个任务都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 他们之间的区别: 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支

weixin_46558851的博客 396
上一篇: UI设计
下一篇: 数据的持久化存储
Flame_Dream
博客等级 码龄12年 35粉丝 82原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值