在apple的操作系统平台里,GCD使得多线程编程是那么的优雅自然。
在传统的多线程编程中,首先要写线程处理循环;之后还有事件队列,消息队列;还要在线程循环中分离事件解释消息,分派处理;还要考虑线程间是否要同步;还要写许多有着可能费解的函数名的回调处理程序,注册回调程序,而且代码分散即使同一文件也不容易看出与哪些线程对应或者彼此间的是否有次序或并发的关系,不利于调试;另外还要考虑是否需要使用线程池,线程线使用何种模式等。
在apple平台的objc中,只需要如下:

A* a;
dispatch_async(queue_serial, ^{
// handle a in step 1;
dispatch_async(queue_concurrent, ^{
// handle a in step 2;
dispatch_async(queue_main, ^{
// handle a in step 3;
});
});
});

优雅,至少我是这样以为的。一目了然,整个流程分了三个子流程,分别在不同线程中运行。子流程间可以并发,第二个子流程可以并行,各个子流程在哪个线程中执行(,除了queue_main和queue_backgroup,其余都是工作线程),所写即所想。
传统中多线程编程的影子无踪,只知道我写到这里要用到多程线异步执行我的任务,好就我说一声异步执行。

并不是说多线程编程就只有这么些,只不过在传统中多线程编程中,实现上面的代码,还得费不少功夫的。不假思索写下的伪代码都有下面这么多,还不好理解。

struct Thread
{
void putq(msg);
uint createThread();
}; struct ThreadStep1 : public Thread
{
queue q;
void register(handler);
void run() {
wait(q);
msg = getq(q);
handler = findHandler(msg);
handler(msg);
}
}; struct ThreadStep2 : public Thread
{
static queue q;
static void register(handler);
void run() {
wait(ThreadStep2::q);
msg = getq(ThreadStep2::q);
handler = findHandler(msg);
handler(msg);
}
}; struct ThreadStep2Pool
{
ThreadStep2 threads[n];
void createThreads();
void register(handler);
}; struct ThreadStep3 : public Thread
{
queue q;
void register(handler);
void run() {
wait(q);
msg = getq(q);
handler = findHandler(msg);
handler(msg);
}
}; void handler1(void* ctx)
{
  // handle get_a(ctx) in step 1
  get_p2(ctx)->putq(ctx);
}
void handler2(void* ctx)
{
  // handle get_a(ctx) in step 2
  get_t3(ctx)->putq(ctx);
}
void handler3(void* ctx)
{
  // handle get_a(ctx) in Step 3
}
main()
{
ThreadStep1 t1;
ThreadStep2Pool p2;
ThreadStep3 t3; t1.createThread();
p2.createThreads(); t1.register(handler1);
p2.register(handler2);
t3.register(handler3); A* a = new a;
msg msg(a, t1, p2, t3);
t1.putq(msg); t3.run();
}

apple平台下的objc的GCD,多线程编程就是优雅自然。的更多相关文章

  1. iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片

    一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...

  2. iOS多线程编程Part 1/3 - NSThread & Run Loop

    前言 多线程的价值无需赘述,对于App性能和用户体验都有着至关重要的意义,在iOS开发中,Apple提供了不同的技术支持多线程编程,除了跨平台的pthread之外,还提供了NSThread.NSOpe ...

  3. python --- 基础多线程编程

    在python中进行多线程编程之前必须了解的问题: 1. 什么是线程? 答:线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程 ...

  4. Object-C关于GCD多线程的使用

    ```objc1 使用Crearte函数创建的并发队列和全局并发队列的主要区别: 1)全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级.默认优先级.低优先级和后台优先级一共四个并发队列, ...

  5. ios 使用GCD 多线程 教程

    什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...

  6. ios开发:GCD多线程

    ios有三种多线程编程技术,分别是NSThread,Cocoa NSOperation和GCD,GCD全称Grand Central Dispatch 是Apple开发的一个多核编程的解决方法,在iO ...

  7. iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    原文出处: 容芳志的博客 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Central Dispatch) 这 ...

  8. [Xcode 实际操作]八、网络与多线程-(22)使用GCD多线程技术异步下载图片

    目录:[Swift]Xcode实际操作 本文将演示如何使用使用GCD多线程技术异步下载图片. Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法 ...

  9. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

随机推荐

  1. ElasticSearch Bulk API

    做一个简单的记录,以便自己后续查找 一.环境要求 ElasticSearch 7.3.0 Kibana 7.3.0 二.详情 ElasticSearch 的 Bulk API 可以批量进行索引或者删除 ...

  2. 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?

    作者 | 蚂蚁金服技术专家 沧漠 关注『阿里巴巴云原生』公众号,回复关键词"1024",可获取本文 PPT. 前言 Kubernetes 以其超前的设计理念和优秀的技术架构,在容器 ...

  3. Visual Studio各版本及数据库各版本下载地址

    1.Visual Studio 2019下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 2.Visual Studio 2017\ ...

  4. MyBatis 示例-联合查询

    简介 MyBatis 提供了两种联合查询的方式,一种是嵌套查询,一种是嵌套结果.先说结论:在项目中不建议使用嵌套查询,会出现性能问题,可以使用嵌套结果. 测试类:com.yjw.demo.JointQ ...

  5. 百万年薪python之路 -- 并发编程之 多线程 二

    1. 死锁现象与递归锁 进程也有死锁与递归锁,进程的死锁和递归锁与线程的死锁递归锁同理. 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,在无外力的作用 ...

  6. 编程语言分类 + python解释器的安装 + jupyter的使用(day 02整理)

    目录 一.昨日内容回顾 一 计算机基础之编程 (一) 什么是编程语言 (二) 什么是编程 (三) 为什么编程 二 计算机组成 (一) CPU (二) 存储器 (三) I/O设备 (四) 多核CPU ( ...

  7. 误删除 mySQL 用户解决办法

    误删除用户解决办法 删除用户 删除用户 mysql> truncate mysql.user;Query OK, 0 rows affected (0.05 sec)​mysql> sel ...

  8. SpringBoot与MybatisPlus整合之活动记录(十五)

    活动记录和正常的CRUD效果是一样的,此处只当一个拓展,了解即可 pom.xml <dependencies> <dependency> <groupId>org. ...

  9. SpringCloud之Zuul配置问题

    当通过网关去调用服务的时候,尤其是服务里面配置了熔断,会发现拿不到熔断返回的信息 hystrix: command: default: execution: isolation: thread: ti ...

  10. 设计模式C++描述----13.代理(Proxy)模式

    一. 举例说明 我们有时打开一个网站时会发现有这样的现象,网站上的文字都显示出来了,但是上面的图片还没显示,要等一会才能显示. 这些未打开的图片的位置上,还是会有图片框和一些等待的信息的,这就是代理模 ...