gcd

IOS多线程

落爺英雄遲暮 提交于 2020-12-15 01:43:07
我们这里不讲解pthread,这个是posix的标准,完全用c语言实现,想要了解的直接上网搜索 posix pthread。 我们现在用的主要有三种:NSThread,GCD, NSOperation.用得最多的是GCD, NSOperation是对GCD的面向对象封装。 NSThread NSThread是最像java线程api的一种,使用的NSThread的坏处是我们要自己管理线程的生命周期。 API: /** * 创建线程的方式3 */ - (void)createThread3 { // 这2个不会创建线程,在当前线程中执行 // [self performSelector:@selector(download:) withObject:@"http://c.gif"]; // [self download:@"http://c.gif"]; [self performSelectorInBackground:@selector(download:) withObject:@"http://c.gif"]; } /** * 创建线程的方式2 */ - (void)createThread2 { [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"http://a

多线程&NSObject&NSThread&NSOperation&GCD

心已入冬 提交于 2020-05-05 12:13:15
1、NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2、NSOperation/NSOperationQueue 面向对象的线程技术 3、GCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。但是就目前而言,iOS的开发者,需要了解三种多线程技术的基本使用过程。因为很多框架技术分别使用了不同多线程技术。 NSThread: 优点:NSThread 比其他两个轻量级,使用简单 缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销 NSOperation: 不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上 NSOperation是面向对象的 GCD: Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术 GCD是基于C语言的 NSObject的多线程方法——后台线程 (void

GCD使用介绍

烈酒焚心 提交于 2020-04-20 07:16:33
一、概念 1、同步异步: a、同步 dispatch_sync():同步执行会等待当前任务执行完再向下执行 b、异步 dispatch_async():不等待当前任务执行完,而是把任务提交后直接向下执行,不等待提交的任务 2、队列 a、串行队列:提交到串行队列的任务会一个一个按顺序执行,上一个任务完成后、再执行下一个 创建方式(2种一样): 1、dispatch_queue_create("tongbu", NULL) 2、dispatch_queue_create("tongbu", DISPATCH_QUEUE_SERIAL); 参数1:队列标签 参数2:队列类型(并发) 3、dispatch_get_main_queue() 主队列也是串行队列 b、并发队列:提交到并发队列的任务对并发执行,每个任务从提交的那一时刻起都会为它创建一个线 程,且无法确定哪一个任务先完成。 创建方式(2种一样): 1、dispatch_get_global_queue(0, 0)//获取系统的全局并发队列 其中,参数1 有以下可选 DISPATCH_QUEUE_PRIORITY_HIGH //2 DISPATCH_QUEUE_PRIORITY_DEFAULT //0 一般选这个即可 DISPATCH_QUEUE_PRIORITY_LOW //-2 DISPATCH_QUEUE_PRIORITY

更相减损法和辗转相除法(GCD)求最小公倍数和最大公约数

佐手、 提交于 2020-04-07 07:26:14
更相减损法和辗转相除法(GCD)求最小公倍数和最大公约数 标签(空格分隔): 算法 算法竞赛 这两种算法平时经常听到,听起来也很装逼,但是我老是忘了他们的原理,今天好好想想,写下来。 更相减损法 更相减损法最早起源于我国的《九章算术》,用于求两个数的最小公倍数。大意是给定两个数a,b,如果存在偶数,就将偶数以2;否则,就比较两数大小,用大数减小数,得到一个差;对差和剩下的那个小数重复该过程,直到两数相等,下一次相减结果为0,这时的数就是a和b的最大公约数。注意,去掉偶数除以2的步骤,也正确,但是加上这一步可能会让时间复杂度减少。 例如:15和12。15-12=3;12-3=9;9-3=6;6-3=3;3=3,跳出。则最大公因数是3。 算法的C/C++代码写法如下(循环实现): int gcdgxjs(int a,int b) { while (a!=b) { if (a if (a>b) a-=b; else b-=a; } return a; ) 辗转相除法 辗转相除法最早是由欧几里得发现的,也被用来求最大公约数。算法是这样的:给定两个数a,b,求a%b,如果余数非0,就继续用除数除以余数,重复该过程,直到除数为0。此时的被除数,就是最大公约数。 例如,42和12。42%12=6;12%6=0,6&0,此时的6即为最大公约数。 算法的C/C++代码写法如下(递归实现): int

求两个数的最大公约数,辗转相除法与更相减损法(递归迭代)

▼魔方 西西 提交于 2020-04-07 07:26:06
问题:给出两个数a和b,求出他们的最大公约数(greatest common divisor)。 解法一:辗转相除法,又叫欧几里得算法。两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数和b之间的最大公约数。 比如10和25,25除以10余5,那么10和25的最大公约数等同于5和10之间的最大公约数。 //辗转相除法 递归解法 int gcd(int a,int b){ if(a%b==0) return b; return (b,a%b); } //辗转相除法 迭代解法int gcd2(int a,int b){ int t; while(b!=0){ t=b; b=a%b; a=t; } return a; } 解法二:更相减损术,出自中国古代的《九章算术》。两个正整数a和b(a>b),他们的最大公约数等于a-b的差值c和较小数b的最大公约数。 比如10和25,25-10=15,那么10和25的最大公约数等于10和15的最大公约数。 //更相减损术 递归 int gcd3(int a,int b){ if(a==b) return a; if(a>b) return gcd(a-b,b); else return gcd(b-a,a); } //更相减损术 迭代 int gcd4(int a,int b){ while(a*b!=0){ if(a>b) a=a-b;

[科技]$Miller\\_Rabin$ 和 $Pollard\\_Rho$ 及各种玄学优化

不羁的心 提交于 2020-04-04 06:19:07
[科技] \(Miller\_Rabin\) 和 \(Pollard\_Rho\) 及各种玄学优化 [科技] \(Miller\_Rabin\) 和 \(Pollard\_Rho\) 先讲 \(Miller\_Rabin\) 吧, \(Miller\_Rabin\) 是用来检验素数的高效算法。 我们先要知道两个定理 : 费马小定理 :当 \(p\) 为质数时, \(x^{p - 1} \equiv 1 \ \ (mod \ \ p)\) 。但这只是一个充分条件,但不是必要条件。即就算 \(x\) 和 \(p\) 互质,那么 \(x^{p - 1}\) 不一定在模 \(p\) 意义下同余于 \(1\) 。 \(Fermat\) 定理 :若 \(p\) 为奇素数,且 \(0 < x < p\) ,那么 \(x ^ 2 \equiv 1 \ \ (mod \ \ p)\) 的解为 \(x = 1\) 或 \(x = p - 1\) 。这个还是比较好证明的,移项可得 \(x ^ 2 - 1 \equiv 0\) ,即 \((x - 1)(x + 1) \equiv 0\) ,可得 \(p | (x - 1)(x + 1)\) 。而 \(p\) 是质数,那么可知 \(x = 1\) 或 \(x = p - 1\) 。 首先我们根据费马小定理就可以排除大量的合数了,即如果存在 \(x\)

GCD 常用操作

落花浮王杯 提交于 2020-04-04 01:48:22
GCD多线程操作 1)用得最多的操作 //获取全局队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //异步执行 dispatch_async(queue, ^{ //下载图片 dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程更新UI }); }); ​ 2)延时执行 1-调用NSObject方法 [Self performSelector:@seletor(run) withObject:nil afterDelay:2.0]; 2-GCD(更好用,不用重新生成方法) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"2222"); }); 3)保证方法在整个程序只执行一次 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ }); ​ 4)组操作,多个请求,请求完成后再执行操作 //创建一个组, dispatch_group_t

Grand Central Dispatch (GCD) 转

北城余情 提交于 2020-04-03 05:31:34
GCD是异步执行任务的技术之一。 GCD使用很简洁的记述方法,实现了极为复杂繁琐的多线程编程。 dispatch_async(queue, ^{ //长时间处理 //例如AR用动画识别 //例如数据库访问 //长时间处理结束,主线程使用该处理结果 dispatch_async( dispatch_get_main_queue(), ^{ //只在主线程可以执行的处理 //例如用户界面更新 }); }); 在NSObject中,提供了两个实例方法来实现简单的多线程技术:performSelectorInBackground:withObject performSelectorOnMainThread。 我们也可以改用performSelector系方法来实现前面使用的GCD。 //NSObject performSelectorInBackground:withObject:方法中执行后台线程 - (void)launchThreadByNSObject_performSelectorInBackground_withObject { [self performSelectorInBackground:@selector(doWork) withObject:nil]; } //后台线程处理方法 - (void)doWork { @autoreleasepool{ //长时间处理,

Grand Central Dispatch(GCD)详解

蓝咒 提交于 2020-04-03 05:31:01
概述 GCD 是苹果异步执行任务技术,将应用程序中的线程管理的代码在系统级中实现。开发者只需要定义想要执行的任务并追加到适当的 Dispatch Queue 中, GCD 就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样比以前的线程更有效率。 GCD的使用 dispatch_sync与dispatch_async dispatch_sync synchronous 同步,一旦调用 dispatch_sync 方法,那么指定的处理 (block) 追加到指定 Dispatch Queue 中在执行结束之前该函数都不会返回,也就是说当前的线程会阻塞,等待 dispatch_sync 在指定线程执行完成后才会继续向下执行。 dispatch_async synchronous异步,一旦调用 dispatch_async 方法,那么指定的处理 (block) 追加到指定的 Dispatch Queue 中, dispatch_async 不会做任何等待立刻返回,当前线程不受影响继续向下执行。 注意 使用 dispatch_sync 容易造成死锁,一般情况下应该使用 dispatch_async ,例如 dispatch_queue_t queue = dispatch_get_main_queue(); dispatch

Grand Central Dispatch (GCD)

此生再无相见时 提交于 2020-04-03 05:30:38
1. 关于 dispatch_once dispatch_once Executes a block object once and only once for the lifetime of an application. 在stackoverflow上有个对dispatch_once的解释,非常棒: What's the exact reason for using dispatch_once in the shared instance accessor of a singleton under ARC? +(MyClass*)sharedInstance { // Static local predicate must be initialized to 0 staticMyClass*sharedInstance = nil; staticdispatch_once_t onceToken =0; dispatch_once(&onceToken,^{ sharedInstance =[[MyClass alloc] init]; // Do any other initialisation stuff here }); return sharedInstance; } dispatch_once() is absolutely synchronous. Not all