apple平台下的objc的GCD,多线程编程就是优雅自然。
在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,多线程编程就是优雅自然。的更多相关文章
- iOS开发——多线程篇——NSOperation(基于GCD多线程编程),下载图片并合成新图片
一.NSOperation的基本概念1.简介NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...
- iOS多线程编程Part 1/3 - NSThread & Run Loop
前言 多线程的价值无需赘述,对于App性能和用户体验都有着至关重要的意义,在iOS开发中,Apple提供了不同的技术支持多线程编程,除了跨平台的pthread之外,还提供了NSThread.NSOpe ...
- python --- 基础多线程编程
在python中进行多线程编程之前必须了解的问题: 1. 什么是线程? 答:线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程 ...
- Object-C关于GCD多线程的使用
```objc1 使用Crearte函数创建的并发队列和全局并发队列的主要区别: 1)全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级.默认优先级.低优先级和后台优先级一共四个并发队列, ...
- ios 使用GCD 多线程 教程
什么是GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法.该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中.GCD ...
- ios开发:GCD多线程
ios有三种多线程编程技术,分别是NSThread,Cocoa NSOperation和GCD,GCD全称Grand Central Dispatch 是Apple开发的一个多核编程的解决方法,在iO ...
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
原文出处: 容芳志的博客 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Central Dispatch) 这 ...
- [Xcode 实际操作]八、网络与多线程-(22)使用GCD多线程技术异步下载图片
目录:[Swift]Xcode实际操作 本文将演示如何使用使用GCD多线程技术异步下载图片. Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法 ...
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
随机推荐
- php分布式是什么
分布式网络存储技术是将数据分散地存储于多台独立的机器设备上.分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务 ...
- CentOS6.6-MySQL报Curses library not found
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 \> -DMYSQL_DATADIR=/application/mysql-5. ...
- .Net Core3.0依赖注入DI
构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法. 不使用依赖注入 首先,我们创建一个ASP.NET Core Mvc项目, ...
- Mybatis总结之如何自动生成数据库表结构
一般情况下,用Mybatis的时候是先设计表结构再进行实体类以及映射文件编写的,特别是用代码生成器的时候. 但有时候不想用代码生成器,也不想定义表结构,那怎么办? 这个时候就会想到Hibernate, ...
- vueclass
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- GCC中,可以使用未声明过的函数
今天代码中使用了一个函数,这个函数也是自定义的,但是还没来得及声明和定义,可以编译时竟然未报错,网上查了下果然,GCC中可以使用未声明的函数http://bbs.csdn.net/topics/390 ...
- Python3.8更新特性
Python 3.8.0稳定版 部分新特性: • PEP 572,赋值+表达式 :=可以将一个表达式或者一个 if (n := len(a)) > 10:#表达式仍然用,赋值也放一起,后面不用多 ...
- 深入理解.NET Core的基元(二) - 共享框架
原文:Deep-dive into .NET Core primitives, part 2: the shared framework 作者:Nate McMaster 译文:深入理解.NET Co ...
- 原生js实现导航栏吸顶
实现滑动滚动条让导航栏吸顶原理:主要是通过监听scroll,设定一个滚动条垂直位移作为临界,让导航栏吸顶或者取消吸顶. 话不多说了,代码如下: window.onscroll = function ( ...
- [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录
为了更好的阅读体验,欢迎阅读原文.原文链接在此. [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录 Part 2: Using G ...