GCD之并行串行区别

1.用户自定义线程队列,创建时很容易创建 注意创建时的第一个参数:标记值,方便调试查看


dispatch_queue_t serialqueue=dispatch_queue_create("serialqueue", DISPATCH_QUEUE_SERIAL);//串行线程队列

dispatch_queue_t concurrentqueue=dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);//并行线程队列

 2.创建之后那如何验证它是串行还是并行的呢?

第一种:


dispatch_apply(5, concurrentqueue, ^(size_t index) {

        NSLog(@"%ld",index);

    });

    dispatch_apply(5, serialqueue, ^(size_t index) {

        NSLog(@"%ld",index);

    });

 输出结果:

第一个循环输出无序第一个有序,可以看出第一个是多线程并行,第二哥是单线程串行。

第二种:

(1)串行的验证:


dispatch_async(serialqueue, ^{

        NSLog(@"1");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"2");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"3");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"4");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"5");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"6");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"7");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"8");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"9");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"10");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"11");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"12");

    });

    dispatch_async(serialqueue, ^{

        NSLog(@"13");

    });

 输出结果:

可以看到输出结果连续。

(2)并行的验证:


dispatch_async(concurrentqueue, ^{

        NSLog(@"1");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"2");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"3");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"4");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"5");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"6");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"7");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"8");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"9");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"10");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"11");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"12");

    });

    dispatch_async(concurrentqueue, ^{

        NSLog(@"13");

    });

 输出结果:

由此可见:输出结果不连续。

3.从上面的两个输出结果可以看出:串行是在一个线程上执行任务,而并行是在多个线程上执行任务。

时间: 2024-10-07 02:07:14

GCD之并行串行区别的相关文章

请问多线程的同步和串行有什么区别

问题描述 请问多线程的同步和串行有什么区别 如果一段代码被锁住执行完再去执行另一段代码,这和顺序执行有什么区别呢,求各位大神解答啊 解决方案 没错,同步的代码,从本质上说,相当于串行(非并发)执行. 解决方案二: 多线程只有同步和异步之分,没有同步和串行. 串行一般只代码一行行有序执行.至于同步异步实际不关心. 解决方案三: 我的意思是如果同步了,不就跟顺序执行一个意思了么,执行完一个块再执行另一个块,那这样的话多线程的同步实际上没有实现并发啊,这个时候的多线程是为了什么呢 解决方案四: 其实多

matlab并行化,求解决。我这有串行的代码了,求转为并行。

问题描述 matlab并行化,求解决.我这有串行的代码了,求转为并行. clear clc tic X=linspace(-3.0,3.0,51); Y=linspace(-3.0,3.0,51); R=0.2;%支持域的尺寸 F=zeros(51,51); for k1=1:51*51 i=mod((k1-1),51)+1 ; %行号 j=floor((k1-1)/51)+1; %列号 x=X(i); y=Y(j); p=[1;x;y];%基函数 %确定网格点(x,y)的影响区域的大小,确定影

《OpenACC并行程序设计:性能优化实践指南》一 第1章 从串行编程到并行编程

第1章 从串行编程到并行编程 Rob Farber TechEnablement.com CEO/创始人 本章主要向读者介绍OpenACC,演示如何使用OpenACC编写运行在多核CPU和类似GPU加速器上的可移植并行程序,并展示如何在CPU和GPU上编译和运行OpenACC程序. 阅读本章后,读者将会理解以下内容: 如何创建.编译和运行OpenACC应用程序. 高性能OpenACC编程的三个准则. 数据并行和任务并行编程的基本概念. 理解大O表示法和Amdahl定律. 竞争条件.原子操作,以及

PHP中的串行化变量和序列化对象

变量|对象     串行化大概就是把一些变量转化成为字符串的字节流的形式,这样比较容易传输.存储.当然,关是传输存储没有什么,关键是变成串的形式以后还能够转化回来,而且能够保持原来数据的结构. 在PHP中有多串行化处理的函数:serialize(),该函数把任何变量值(除了资源变量)转化为字符串的形式,可以把字符串保存到文件里,或者注册为Session,乃至于使用curl来模拟GET/POST来传输变量,达到RPC的效果. 如果要将串行化的变量转化成PHP原始的变量值,那么可以使用unseria

怎样给串行化类分配版本号(可配置版本模式)

编写可串行化类时,MFC用你指定的模式号制定一个粗略的版本控制方式.在向档案写数据时, MFC用模式标记该类的实例:而在读回数据时,MFC将档案中的记录的模式号和应用程序中使用着的该类对象的模式号做比较,如果两模式号不匹配,则MFC发送一个CArchiveException,其m_cause 等于CArchiveException::badSchema.没有得到处理的该类异常会促使MFC显示一个对话框,提示 "非预期的文件格式".如果每次修改对象的串行化存储格式时都能做到增加模式号,那

串行化(Serialization)

串行化是微软提供的用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用.很多人对什么是串行化.怎么使对象具有串行化能力和如何使用串行化功能等问题都不甚明了.本文试图对串行化做一个简单的解释.由于本人对串行化功能使用的也不多,不足之处敬请谅解. MFC 框架/文档/视图结构中的文件读写 CFile是MFC类库中所有文件类的基类.所有MFC提供的文件I/O功能都和这个类有关.很多情况下,大家都喜欢直接调用CFile::Wr

ZooKeeper客户端事件串行化处理

为了提升系统的性能,进一步提高系统的吞吐能力,最近公司很多系统都在进行异步化改造.在异步化改造的过程中,肯定会比以前碰到更多的多线程问题,上周就碰到ZooKeeper客户端异步化过程中的一个死锁问题,这里说明下. 通常ZooKeeper对于同一个API,提供了同步和异步两种调用方式. 同步接口很容易理解,使用方法如下: ZooKeeper zk = new ZooKeeper(...); List children = zk.getChildren( path, true ); 异步接口就相对复

RAPIDIO高速串行协议

RapidIO是由Motorola和Mercury等公司率先倡导的一种高性能. 低引脚数. 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放式互连技术标准.RapidIO主要应用于嵌入式系统内部互连,支持芯片到芯片.板到板间的通讯,可作为嵌入式设备的背板(Backplane)连接. RapidIO协议由逻辑层.传输层和物理层构成.逻辑层定义了所有协议和包格式.这是对终端进行初始化和完成传送的很有必要的信息.传输层为数据包从一个终端到另一个终端通道的必要信息.物理层

Spark 多个Stage执行是串行执行的么?

上次在做内部培训的时候,我讲了这么一句: 一个Job里的Stage都是串行的,前一个Stage完成后下一个Stage才会进行. 显然上面的话是不严谨的. 看如下的代码: Snip20160903_17.png 这里的话,我们构建了两个输入(input1,input2),input2带有一个reduceByKey,所以会产生一次Shuffle,接着进行Join,会产生第二次Shuffle(值得注意的是,join 不一定产生新的Stage,我通过强制变更join后的分区数让其发生Shuffle ,然