gcd

Object-C 多线程中锁的使用-NSLock

旧街凉风 提交于 2019-12-06 00:15:51
一、使用 synchronized 方式 // 线程 1 dispatch_async ( dispatch_get_global_queue ( DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 ), ^{ @synchronized ( _myLockObj ){ [obj1 method1 ]; sleep ( 30 ); } @synchronized (obj1){ } }); // 线程 2 dispatch_async ( dispatch_get_global_queue ( DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 ), ^{ sleep ( 1 ); @synchronized ( _myLockObj ){ [obj1 method2 ]; } }); } 这样,就会起到锁的作用,线程2会等待线程1执行完成 @synchronized (obj){ }块后,在执行。从而起到锁的作用。 2.使用 NSLock 方式 先贴一个例子: 1. TestObj.h @interface TestObj : NSObject - ( void )method1; - ( void )method2; @end 2. TestObj.m #import "TestObj.h" @implementation TestObj

iOS开发多线程GCD(二)

笑着哭i 提交于 2019-12-05 20:10:46
上一章我们简单介绍了iOS多线程,本章我们讲解GCD多线程 GCD (Grand Central Dispatch) 是 iOS 多任务的核心。在 Mac OS X 10.6 雪豹中首次推出,后被引入到了 iOS 4.0 中。GCD 是基于 C 的 API,是底层的框架,因此效率最高 一、分组管理 /* 分组的主要目的 是判断一组操作 是否全部执行结束 原理 将需要执行的操作 添加到同一个分组下 如果其中的某一个操作结束 就会组中移除 当组里面的操作数变为0的 说明所以的操作全部结束 */ //1.创建一个分组 管理任务 dispatch_group_t myGroup = dispatch_group_create(); //2.获取一个队列 管理的任务放在哪一个线程中来管理 //主队列就表示任务放在主线程中 自定义队列就表示任务放在分线程中(子线程) //dispatch_queue_t 表示一个队列表示获取一个队列表示获取一个队列全局队列 官方提供一个队列 该队列 默认的是并发处理 线程中的任务可以同时处理多个全局队列 官方提供一个队列 该队列 默认的是并发处理 线程中的任务可以同时处理多个 //dispatch_get_global_queue() dispatch_queue_t HIGH = dispatch_get_global_queue(DISPATCH

多线程的底层实现机制

扶醉桌前 提交于 2019-12-05 15:36:08
1.多线程的底层实现 (1)首先回答什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 (2)什么是多线程 1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。 多线程的作用:更新显示UI界面、处理用户触摸事件。 (3)Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程。 (4)开发中实现多线程的方案 1》C语言的POSIX接口:#include<pthread.h> 2》OC的NSThread 3》 C语言的GCD接口(性能最好,代码更精简) 4》 OC的NSOperation和NSOperationQueue(基于GCD) 2.线程的通信 (1)GCD: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 下载图片 UIImage *image = nil; dispatch_async(dispatch_get_main_queue(), ^{ // 回到主线程 }); (2)NSThread的线程通信 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT

iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用

廉价感情. 提交于 2019-12-05 14:32:04
iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用 目录 (?) [+] 介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6 ,iOS 4及以上也可用。 设计: GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。 一个任务可以是一个函数(function)或者是一个 block 。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。 GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行 dispatch queue分为下面三种: Serial 又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。 Concurrent 又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。 Main dispatch

HDU 6588

别来无恙 提交于 2019-12-05 12:39:18
求$$\sum_{i=1}^{n} \gcd(\lfloor \sqrt[3]{i} \rfloor, i)$$ 题解写的很清楚,自己重新推一推。 $$\sum_{i=1}^{n} \gcd(\lfloor \sqrt[3]{i} \rfloor, i)$$ $$=\sum_{a=1}^{\lfloor\sqrt[3]{n}\rfloor}\sum_{i=1}^{n}\gcd(a, i)[\sqrt[3]{i}=a]$$ $$=\sum_{a=1}^{\lfloor\sqrt[3]{n}\rfloor}\sum_{i=a^3}^{\min\{(a+1)^3-1,n\}}\gcd(a,i)$$ $$=\sum_{i=\lfloor \sqrt[3]{n} \rfloor ^3}^{n}\gcd(\sqrt[3]{n}, i)+\sum_{a=1}^{r}\sum_{i=a^3}^{(a+1)^3-1}\gcd(a,i)$$ 来源: https://www.cnblogs.com/Mrzdtz220/p/11925427.html

GCD 面试题

血红的双手。 提交于 2019-12-05 04:41:14
今天我们讲解几道这两天遇到的面试题--GCD编程的.题目很不错,很考究关于GCD的基本概念和使用. 对于基本的概念,本人博客已在前面讲过,本篇主要以面试题来讲解.大家可看一下本人关于GCD的基本讲解 https://www.cnblogs.com/guohai-stronger/p/9038567.html GCD编程的核心就是dispatch队列, dispatch block的执行都会最终放到某个队列中执行.我们直接以题目来讲解: 【例1】GCD面试题1 - (void)viewDidLoad { [super viewDidLoad]; [self testGCD]; } - (void)testGCD { //并行队列 dispatch_queue_t queue = dispatch_queue_create("zxy", DISPATCH_QUEUE_CONCURRENT); NSLog(@"1"); dispatch_async(queue, ^{ NSLog(@"2"); dispatch_async(queue, ^{ NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); } 讲解 : 首先看创建队列是 并行 队列,无需等待; 首先打印出 1 ,然后看dispatch_async,将dispatch

裴蜀定理的证明

徘徊边缘 提交于 2019-12-05 04:11:22
转载自 https://www.cnblogs.com/bljfy/p/9316784.html 定理 ax+by=c,x∈Z∗,y∈Z∗成立的充要条件是gcd(a,b)|c 证明 设s=gcd(a,b),显然s|a,并且s|b 又因为x,y∈Z 所以s|ax,s|by 显然要使得之前的式子成立,则必须满足c是a和b的公约数的倍数 又因为x和y是正整数 所以c必然是a,b最大公约数的倍数。 因此,证得该定理成立 来源: https://www.cnblogs.com/juruo-zzt/p/11904928.html

拓展欧几里得算法(数论)

家住魔仙堡 提交于 2019-12-04 20:44:51
拓展欧几里得 是用来计算已经知道 a 和 b 的时候,让你去求 a*x+b*y=GCD(a,b) 的一组解 (x,y) 。(首先根据一些相关数论证明,这个解是一定存在的) GCD(a,b) 应该都知道吧,求a和b的最小公约数。 因为GCD(a,b)=GCD(b,a%b),所以a*x+b*y=GCD(b,a%b),也就意味着a*x+b*y=b*x-(a%b)*y,进而可以得出x*a+y*b=y*a+(x-y*a/b)*b; 最后推到最后是当b为0的时候,a为最小公约数,根据第一个式子,a*x+b*y=a; (但是此时的x和y是进过多次替换过的,并不是最开始的那个x,y了) 但是我们可以递归回我们需要的那个最开始的x,y。 这就是拓展欧几里得。 代码实现: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int x,y; int ex_gcd(int a,int b) { int ret,tem; if(!b) { x=1;y=0; return a; } ret=ex_gcd(b,a%b); tem=x; x=y; y=tem-a/b*y; return ret; } int main() { int a,b,z; scanf("%d%d"

GCD基本使用

痴心易碎 提交于 2019-12-04 19:04:12
GCD两个基本知识:任务和队列; 任务执行方式分为两种:同步(sync)和异步(async) 队列也分为两种:并发队列和串行队列; 各种组合方式: 异步函数+并发队列:开启多条线程,并发执行任务 异步函数+串行队列:开启一条线程,串行执行任务 同步函数+并发队列:不开线程,串行执行任务 同步函数+串行队列:不开线程,串行执行任务 异步函数+主队列:不开线程,在主线程中串行执行任务 同步函数+主队列:不开线程,串行执行任务(发生死锁) GCD基本函数: dispatch_barrier_async/dispatch_group_notify/dispatch_semaphore_wait 不会阻塞线程 dispatch_group_wait 会阻塞线程 dispatch_barrier_async 控制任务的执行顺序 queue必须是手动创建的并行队列; 所有位于dispatch_barrier_async函数之前的操作执行完毕后dispatch_barrier_async才会执行; dispatch_barrier_async函数执行之后,barrier函数之后的操作才会得到执行; 该函数需要同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用; dispatch_queue_t queue = dispatch

Effective Objective-C Notes:GCD 实现同步锁

我们两清 提交于 2019-12-04 19:03:57
本文名为《GCD 实现同步锁》,内容不止于锁。文章试图通过 GCD 同步锁的问题,尽量往外延伸扩展,以讲解更多 GCD 同步机制的内容。 引语:线程安全问题 如果一段代码所在的进程中有多个线程在同时运行,那么这些线程就有可能会同时运行这段代码。假如多个线程每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 由于可读写的全局变量及静态变量可以在不同线程修改,所以这两者也通常是引起线程安全问题的所在。在 Objective-C 中还包括属性和实例变量(实际上属性和实例变量本质上也可以看做类内的全局变量)。 Objective-C 同步锁 在 Objective-C 中,如果有多个线程执行同一份代码,那么有可能会出现线程安全问题。这种情况下,就需要一个同步机制来解决 —— 锁(lock)。在 Objective-C 中,有如下几种可用的锁: NSLock 实现锁 NSLock是Cocoa提供给我们最基本的锁对象,这也是我们经常所使用的锁之一。 . @synchronized 关键字构建的锁 synchronized指令实现锁的优点就是我们不需要在代码中显式的创建锁对象,便可以实现锁的机制