gcd

iOS中实现多线程的技术方案

老子叫甜甜 提交于 2020-03-08 10:02:59
pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { NSLog(@"---buttonclick---%zd---%@", i, [NSThread currentThread]); } return NULL; } @implementation ViewController - (IBAction)clickButton:(id)sender { // 定义一个线程 pthread_t thread; // 创建一个线程 (参1)pthread_t *restrict:创建线程的指针,(参2)const pthread_attr_t *restrict:线程属性 (参3)void *(*)(void *):线程执行的函数的指针,(参4)void *restrict:null pthread_create(&thread, NULL, run, NULL); // 何时回收线程不需要你考虑 pthread_t thread2; pthread_create(&thread2, NULL, run, NULL); } NSThread实现多线程 一个 NSThread 对象就代表一条线程 创建线程的多种方式 第一种方式:先创建再启动线程 // 创建线程

iOS多线程之GCD详解

◇◆丶佛笑我妖孽 提交于 2020-03-08 10:02:49
GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制。也是目前苹果官方推荐的多线程开发方法。iOS三种多线程开发中GCD是抽象层次最高的。当然用起来也是最简单的。只是它基于C语言开发。并不像NSOperation是面向对象的开发。而是完全面向过程的。这种机制相比较于前面两种多线程开发方式最明显的优点就是它对于多核运算更佳有效。 GCD中也有一个类似于NSoperationQueue的队列,GCD统一管理整个队列中的任务。但是GCD中的队列氛围并行队列和串行队列两类。   串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。   并发队列:有多个线程,操作进来之后他会将这些队列安排到可用的处理器上。同时保证先进来的任务优先处理。 其实在GCD中还有一个特殊的队列就是主队列,用来执行主线程上的操作任务。(从前面的演示中可以看到其实在NSOperation中也有一个主队列) 串行队列 使用串行队列时首先要创立一个串行队列,然后调用异步调用方法,在此方法中传入串行队列和线程操作即可自动执行。下面就是一个例子。 #define ROW_COUNT 5 #define COLUMN_COUNT 3 #define ROW_HEIGHT 100 #define ROW_WIDTH ROW_HEIGHT #define CELL_SPACING 10

关于iOS多线程的总结

笑着哭i 提交于 2020-03-08 10:01:16
关于iOS多线程的总结 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园。OK,let's begin! 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串行、什么是并行等问题,这些我们应该都知道的。 在 iOS 中其实目前有 4 套多线程方案,他们分别是: Pthreads NSThread GCD NSOperation & NSOperationQueue 所以接下来,我会一一讲解这些方案的使用方法和一些案例。在将这些内容的时候,我也会顺带说一些多线程周边产品。比如: 线程同步 、 延时执行 、 单例模式 等等。 Pthreads 其实这个方案不用说的,只是拿来充个数,为了让大家了解一下就好了。百度百科里是这么说的: POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。 简单地说,这是一套在很多操作系统上都通用的多线程API,所以移植性很强

算法:辗转相除法【欧几里德算法(Euclidean algorithm)】

青春壹個敷衍的年華 提交于 2020-03-08 05:22:10
1.来源 设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q ......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q ......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2, ……如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。 例如:a=25,b=15,a/b=1 ......10,b/10=1 ......5,10/5=2 .......0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。 2.原理 3.算法 自然语言描述 用辗转相除法确定两个正整数 a 和 b(a≥b) 的最大公因数gcd(a,b): 当a mod b=0 时gcd(a,b)=b,否则 gcd(a,b) = gcd(b,a mod b) 递归或循环运算得出结果 /** * * @return int * @tags @param m * @tags @param n * @tags @return * @todo 【方法二】利用辗除法 */ public static int gcd(int m, int n) { while (true) { if ((m = m % n) == 0) return n; if ((n = n % m) ==

GCD之用dispatch_once创建单例

给你一囗甜甜゛ 提交于 2020-03-03 21:25:34
单例模式是开发者常用的一种设置模式,常见的实现方式为:在类中编写名为 sharedInstance的方法,该方法只会返回全类共用的单例实例,而不会在每次调用时创建新的实例. 常见的做法是: + (instancetype)sharedUser { static User *_sharedInstance = nil; @synchronized(self) { if (!_sharedInstance) { _sharedInstance = [[self alloc] init]; } } return _sharedInstance; } 为了保证线程安全,上面的代码把创建代理的代码包裹在同步块里. 相对于上面的实现方式,使用GCD的dispatch_once实现起来更为容易. 所用到的函数是: static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // code to be executed once }); 此函数接受的类型为 dispatch_once_t的特殊函数 token,此外还接受块参数.对于给定的token来说,该函数保证相关的块必定会执行,且仅执行一次.首次调用该函数时必然会执行块中的代码, 最重要的是:次操作完全是线程安全的!!!需要注意的是:对于只需执行一次的块来说

Objective-C-GCD

女生的网名这么多〃 提交于 2020-03-03 21:20:26
队列 & 线程的执行方式(任务) 任务:block,消息等函数块,他是由线程执行的。 线程执行任务的方式: 同步线程:当前线程a只能执行完事件A才能执行任务B。 异步线程:当前线程a执行A的时候又开了个线程b,执行任务B 队列:存储任务 串行队列:一个任务(block)接着一个任务的出队。一般由一个线程处理这一个队列 并发队列:一次有多个任务出队,由多个线程处理。使用异步线程执行。 2.GCD: 线程执行方式: 同步:dispatch_sync 异步:dispatch_async 队列: 串行:串行队列,dispatch_queue_create,主队列dispatch_get_main_queue 并发:全局队列,dispatch_get_global_queue mainThread <--->mainQueue 3.GCD线程间通信图: 4. dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"download:%@", [NSThread currentThread]); NSURL *url = [NSURL URLWithString:@"http://pic.nipic.com/2007-12-06/2007126205543511_2.jpg"]; NSData *data = [NSData

iOS NSThread、NSOperation与GCD

对着背影说爱祢 提交于 2020-03-02 11:43:34
一、NSThread线程 优点: NSThread 比其他两个轻量级、使用方便、简洁。 缺点: ①需要自己管理线程的生命周期。 ②线程同步,线程同步对数据的加锁会有一定的系统开销 NSThread线程的使用: 启动一个线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadTask) object:nil]; thread.name=@"sum"; [thread start] 停止线程 [thread cancel]; thread = nil; 注意:停止线程的并不是直接杀死线程,而是设置了个标记 -(void) myThreadTask{ @autoreleasepool { NSLog(@"Thread Entry Point"); while ([[NSThread currentThread] isCancelled] == NO){ [NSThread sleepForTimeInterval:10]; NSLog(@"Thread Loop"); } NSLog(@"Thread Finished"); } } 还有一类用法如下: [NSThread detachNewThreadSelector:@selector(bigDemo)

【题解】P1029 最大公约数和最小公倍数问题

你离开我真会死。 提交于 2020-03-02 07:58:11
目录 P1029 最大公约数和最小公倍数问题 方法一 方法二 P1029 最大公约数和最小公倍数问题 方法一 要知道最大公约数和最小公倍数的乘积就是原两个数的积。 换成公式就是: x ∗ y = g c d ( x , y ) ∗ l c m ( x , y ) x*y=gcd(x,y)*lcm(x,y) x ∗ y = g c d ( x , y ) ∗ l c m ( x , y ) 本题中是要找到符合条件的 P = g c d ( x , y ) P=gcd(x,y) P = g c d ( x , y ) Q = l c m ( x , y ) Q=lcm(x,y) Q = l c m ( x , y ) 枚举 i<sqrt(x*y) ,如果 x*y%i==0 ,那么若 gcd(i,mul/i)==x 就cnt+=2; 附奇怪的证明 # include <bits/stdc++.h> using namespace std ; const int N = 1e6 + 10 ; int x , y , mul , cnt ; int main ( ) { cin >> x >> y ; if ( x == y ) cnt -- ; mul = x * y ; for ( int i = 1 ; i * i <= mul ; i ++ ) { if ( mul % i == 0

贝祖公式证明

懵懂的女人 提交于 2020-03-02 00:21:02
贝祖公式证明 前言:最近写一道算法题的过程中,遇到了关于贝祖公式的题目,发现其实很简单。根据前人总结证明方法,进行归纳,在此证明。 一. 欧几里得算法 要证明贝祖公式,首先需要知道欧几里得算法,欧几里得算法也叫辗转相除法,用于求两个整数之间的最大公约数。 公式如下: gcd(a,b) = gcd(b,a mod b) (a>b 且 a mod b 不为0) 证明如下: 因为a>b,所以a可以表示为kb+r,r=a mod b 从左往右看,假设d是a,b的一个公约数,那么a和b都可以被d整除,r=a-kb,自然r也可以被d整除,所以d也是(b,r),也就是(b,a mod b)的公约数。 反过来,假如d是b和r = a mod b的一个公约数,则有b和r都可以被d整除,根据a=kb+r,自然a也可以被d整除,所以d也是(a,b)的公约数。 因此,(a,b)和(b,a mod b)的公约数一致,自然最大公约数也一致。 欧几里得算法应用:不断运用该算法,即“两个整数的最大公约数,等于其中较小的那个数和较大数对较小数取模结果的最大公约数。” 将两个数缩小,直到一个数为0,另一个数就是最小公约数 eg,求12和42的最大公约数,gcd(12,42) = gcd(12,6)=gcd(6,0)=6 二、贝祖公式 根据前面推导的欧几里得算法,贝祖公式就应运而生啦!

iOS多线程之GCD

这一生的挚爱 提交于 2020-03-01 22:46:57
1.简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核、四核) GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 2.任务和队列 GCD有两个核心概念 任务:执行什么操作 队列:用来存放任务 GCD的使用有两个步骤 定制任务 确定想做的事情 将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 3.执行任务 GCD中有2个用来执行任务的函数 用同步的方式执行任务 dispatch_sync(dispatch_queue_t queue, dispatch_block_t block); queue:队列 block:任务 用异步的方式执行任务 dispatch_async(dispatch_queue_t queue, dispatch_block_t block); 同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行 4.队列的类型 并发队列 可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务) 并发功能只有在异步