展开

关键词

iOS线之深入GCD 原

iOS线之深入GCD 一、前言         在以前的一些系列博客中,对iOS线的管理做了总结,其中涵盖了GCD的相关基础知识:http://my.oschina.net/u/2340880 那里面将GCD的线管理能力,列队组能力,通过信号和消息控制序流的能力都有介绍,这里,我们继续深入GCD的功能,通过GCD来处理一些逻辑更加复杂的代码功能。 )aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; 然而,如果我们需要在线中进行延时操作,上面两种方式会显得十分麻烦 三、数据存取的线安全问题         在进行线时,或许总会遇到一类问题,数据的竞争与线的安全。这些问题如果我们通过序手动来控制难度将会非常大。 ,可是并不能保证序百分百的安全,因为在线的操作中,会有可能初始化个对象,在GCD中,我们可以使用如下方式: +(instancetype)shared{     static Auto * obj

14610

iOS线学习之旅

线经典问题:资源共享 ? 代码实现: ? 形成一条资源的bug ? 解决方案 ? 互斥锁小结 保证锁内的代码,同一时间,只有一条线能够执行! 互斥锁参数 能够加锁的任意 NSObject 对象 注意:锁对象一定要保证所有的线都能够访问 如果代码中只有一个地方需要加锁,大都使用 self,这样可以避免单独再创建一个锁对象 说到锁,我们再来看看苹果爸爸的给出干货 atomic与nonatomic 的区别 nonatomic 非原子属性 atomic 原子属性(线安全),针对线设计的,默认值 保证同一时间只有一个线能够写入(但是同一个时间线都可以取值 ) atomic 本身就有一把锁(自旋锁) 单写读:单个线写入,线可以读取 atomic:线安全,需要消耗大量的资源 nonatomic:非线安全,适合内存小的移动设备 iOS 的建议 所有属性都声明为 nonatomic 尽量避免线抢夺同一块资源 尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力 这是线系列的第三篇文章,下篇会继续探究线, 敬请期待.

21910
  • 广告
    关闭

    腾讯云+社区系列公开课上线啦!

    Vite学习指南,基于腾讯云Webify部署项目。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    线安全-iOS注意咯!!!

    线,作为实现软件并执行的一个重要的方法,也始具有越来越重要的地位!” ? 正式因为线能够在时间片里被CPU快速切换,造就了以下优势 资源利用率更好 序设计在某些情况下更简单 序响应更快 但是并不是非常完美,因为线常常伴有资源抢夺的问题,作为一个高级人员并那是必须要的 换句话说:使用条件变量可以让许线一起等待某个时间的生,当某个时间生时,所有的线可以一起恢复执行! r_sem); 读读读…… sem_wait(&r_sem); readers- -; if(readers == 0) sem_post(&w_sem); sem_post(&r_sem); 线的安全是现在各个领域在线必须要掌握的基础 只有对底层有所掌握,才能在真正的实际中游刃有余!现在的iOS乃至其他都是表面基础层,真正大牛之路还请继续努力,这一篇博客以供大家一起学习!

    22940

    线安全-iOS注意咯!!!

    线,作为实现软件并执行的一个重要的方法,也始具有越来越重要的地位! [1240] 正式因为线能够在时间片里被CPU快速切换,造就了以下优势 资源利用率更好 序设计在某些情况下更简单 序响应更快 但是并不是非常完美,因为线常常伴有资源抢夺的问题,作为一个高级人员并那是必须要的 换句话说:使用条件变量可以让许线一起等待某个时间的生,当某个时间生时,所有的线可以一起恢复执行! 读读读…… sem_wait(&r_sem); readers- -; if(readers == 0) sem_post(&w_sem); sem_post(&r_sem); 复制代码 线的安全是现在各个领域在线必须要掌握的基础 只有对底层有所掌握,才能在真正的实际中游刃有余!现在的iOS乃至其他都是表面基础层,真正大牛之路还请继续努力,这一篇博客以供大家一起学习!

    50320

    线iOS中的应用

    本文重点 NSThread 线基础、pthread、线的3种方式 线的状态、线安全问题、线间的通信 GCD 同步方法和异步方法、队列的使用、线间的通信 延迟执行、一次性代码、队列组 线执行,其实就是CPU快速地在线之间调度(如果CPU调度的时间足够快,就造成了线执行的假象) 二、线iOS中的应用 1、什么是主线:一个iOS序运行之后,默认会启一条线 2.2 iOS线的实现方案 公众号:iOS逆向 iOS支持个层次的线,层次越高的抽象度越高,使用也越方便,也是苹果最推荐使用的方法。 根据抽象层次从低到高依次列出iOS所支持的线方法: Thread :是三种方法里面相对轻量级的,但需要管理线的生命周期、同步、加锁问题,这会导致一定的性能销 Cocoa Operations Grand Central Dispatch(简称GCD,iOS4始支持):提供了一些新特性、运行库来支持核并行编,它的关注点更高:如何在个cpu上提升效率 2.4 线状态 公众号:iOS逆向

    16820

    iOS线技术(NSThread、OperationQueue、GCD)

    在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS线的东西。 其实线的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解线的东西还是比较容易的,今天就做一个小的demo来详细的了解一下iOS中的线的东西。 三、线间的同步问题(为我们的线添加上同步锁)     在操作系统中讲线时有一个名词叫脏数据,就是线操作同一块资源造成的,下面就修改一下代码,让数据出现问题,然后用同步锁来解决这个问题      GCD的串行队列始执行的顺序如下,下面是是在一个线中按FIFO的顺序执行的: ?   GCD中的并行队列,是在不同的线中同时执行的: ?    今天博客中的内容还是蛮的,如果之前接触过Java的线的东西,或者其他语言中的线的话,理解起来应该问题不大。

    36450

    iOS线

    四、线 1个进中可以线,每条线可以并行(同时)执行不同的任务。进 -> 车间,线 -> 车间工人。线技术可以提高序的执行效率。 比如可以同时下载个文件。 线(同时)执行,其实是 CPU 快速地在线之间调度(切换),如果 CPU 调度的时间够快,就造成了线执行的假象。 但是如果线非常非常,会生什么情况呢? 六、线的优缺点 优点: 能适当提高序的执行效率 能适当提高资源利用率(CPU、内存利用率) 缺点: 创建线是有销的,iOS下主要成本包括:内核数据结构(大约 1 KB)、栈空间(子线 512 如果启大量的线,会降低序的性能 线,CPU 在调度线上的销越大 *序设计更加复杂:比如线之间的通信,线的数据共享。 七、线iOS 中的应用 主线:一个 iOS 序运行后,默认会启一条线,称为『主线』或『UI 线』。

    40130

    IOS-线

    一·什么是线,进我们的管理控制器 QQ截图20201214000219.png 二·五大区 栈 局部变量&调用的上下文 (自动管理,可读可写,不可执行) 函数的参数:id,self,sel, imp 堆 new&malloc (手动管理,可读可写,不可执行) 辟空间alloc,并且赋予一个地址指针,方便管理,通过链表结构(方便增删,不便查找)所以通过类似数组的形式,给辟的空间一个指针地址 常量区(已初始化区) 字符串 & 常量 &宏定义 (只读,不可执行) 全局区(未初始化区) 静态变量&全局变量(可读可写,不可执行) 代码区 __TEXT(指令,只读,可执行) 三·线生命周期 QQ 截图20201214003012.png 四·线池工作大概原理 QQ截图20201214003634.png 五·饱和策略(AbortPolicy) 1.RejectedExecutionExeception 资源抢夺 当我们讨论线安全,问题都会归于一个问题上:在I/O操作中,在线线之间会生资源抢夺 应对方法:1.加锁 synchronized 互斥锁:进入runable状态,等待唤醒 自旋锁:一直访问

    27950

    iOS --怎样高效的使用线

    [1240] 收录:原文地址 写在前面 线技术在移动端中应用广泛,GCD 让 iOS 者能轻易的使用线,然而这并不意味着代码就一定高效和可靠。 不管是处理器设备还是核设备,者往往只需要关心 CPU 的核心数量,而不需关心它们的物理构成。 二、线的优化思路 在移动端中,因为系统的复杂性,者往往不能期望所有线都能真正的并执行,而且者也不清楚 XNU 何时切换内核态线、何时进行线调度,所以者要经常考虑到线调度的情况 虽然内核态线的切换理论上不会是性能负担,中还是应该尽量减少线的切换。 4、时刻注意不可重入方法的安全 当一个方法是可重入的时候,可以放心大胆的使用,若一个方法不可重入,者应该留意,思考这个方法会不会有线访问的情况,若有就老老实实的加上线锁。

    42240

    Python 线

    线的优点 因为要并,我们明了进,又进一步明了线。只不过进线的并层次不同:进属于在处理器这一层上提供的抽象;线则属于在进这个层次上再提供了一层并的抽象。 除了提高进的并度,线还有个好处,就是可以有效地利用处理器和核计算机。现在的处理器有个趋势就是朝着核方向展,在没有线之前,核并不能让一个进的执行速度提高,原因还是上面所有的两点限制。 但如果讲一个进分解为若干个线,则可以让不同的线运行在不同的核上,从而提高了进的执行速度。 例如:我们经常使用微软的Word进行文字排版,实际上就打线。 一个线可以创建和撤销另一个线,同一个进中的线之间可以并执行。 进线的主要差别在于它们是不同的操作系统资源管理方式。 for i in range(20):     name = '小喻%d' %(i,)     temp = consumer(name,que)     temp.start() python 线之事件

    25200

    iOS线

    OS X和iOS的核心XNU内核在生操作系统事件时(如每隔一定时间,唤起系统调用等情况)会切换执行路径。 串行:一个线按顺序执行 并:由于使用线序可以在某个线和其他线之间反复次进行上下文切换,因此看上去就好像1个CPU核能够并列的执行线一样。 假设准备4个Concurrent Dispatch Queue 用线。首先blk0在线0中始执行,接着blk1在线1中、blk2在线2中、blk3在线3中始执行。 线0中blk0执行结束后始执行blk4,由于线1中blk1的执行没有结束,因此线2中blk2执行结束后始执行blk5,就这样循环往复。      关于使用NSOperation进行线,看我这篇帖子:iOS线--NSOperation demo下载:https://github.com/wangdachui/multithreading.git

    47560

    IOS 线、进

    selector: selector(ViewController.threadAction), object:nil) 2 thread.stackSize = 1024 * 1024 ///使用线下载图片 imageView = UIImageView() 2 var label = UILabel() 接着对viewDidLoad方法进行修改,对imageView属性和label属性进 行初始化,并创建一个新的线来执行网络图片的下载工作

    16820

    iOS线

    OS X和iOS的核心XNU内核在生操作系统事件时(如每隔一定时间,唤起系统调用等情况)会切换执行路径。 串行:一个线按顺序执行 并:由于使用线序可以在某个线和其他线之间反复次进行上下文切换,因此看上去就好像1个CPU核能够并列的执行线一样。 假设准备4个Concurrent Dispatch Queue 用线。首先blk0在线0中始执行,接着blk1在线1中、blk2在线2中、blk3在线3中始执行。 线0中blk0执行结束后始执行blk4,由于线1中blk1的执行没有结束,因此线2中blk2执行结束后始执行blk5,就这样循环往复。      关于使用NSOperation进行线,看我这篇帖子:iOS线--NSOperation demo下载:https://github.com/wangdachui/multithreading.git

    19330

    iOS 线--NSThread

    )ti; //进入阻塞状态 强制停止线 +(void)exit; //进入死亡状态 注意:一旦线停止(死亡)了,就不能再次启任务。 五、线的安全隐患 资源共享 1 块资源可能会被线共享,也就是说线可能会访问同一块资源 比如线访问同一个对象、同一个变量、同一个文件 当线访问同一块资源时,很容易引数据错乱和数据安全问题 缺点:需要消耗大量的 CPU 资源 3.互斥锁的使用前提:线抢夺同一块资源 4.相关专业术语:线同步 线同步的意思是:线在同一条线上执行(按顺序地执行任务) 互斥锁,就是使用了线同步技术 ,需要消耗大量的资源 nonatomic:非线安全,适合内存小的移动设备 iOS建议 所有属性都声明为 nonatomic 尽量避免线抢夺同一资源 尽量将加锁,资源抢夺的业务逻辑交给服务器端处理 在一个进中,线往往不是孤立存在的,线之间需要经常进行通信 2.线间通信的体现 1 个线传递数据给另一个线 在 1 个线中执行完特定任务后,转到另 1 个线继续执行任务 3.线间通信常用方法

    20620

    iOS 线 - NSOperation

    配合使用 NSOperation 和 NSOperationQueue 也能实现线。 NSOperation 和 NSOperationQueue 实现线的具体步骤 先将需要执行的操作封装到一个 NSOpertion 对象中 然后将 NSOperation 对象添加到 NSOperationQueue -(void)start; 一旦执行操作,就会调用 target 的 sel 方法 注意: 默认情况下,调用了 start 方法后并不会一条新线去执行操作,而是在当前线同步执行操作 只有将 同时执行的任务数,比如,同时 3 个线执行 3 个任务,并数就是 3 最大并数的相关方法 -(NSInteger)maxConcurrentOperationCount; -(void)setMaxConcurrentOperationCount 非主队列(其他队列) [[NSOperationQueue alloc] init] 同时包含了:串行、并功能 添加到这种队列中的任务(NSOperation),就会自动放到子线中执行 8.NSOperation

    18110

    iOS线 - GCD

    一、GCD 的优势 GCD 是苹果公司为核的并行运算提出的解决方案 GCD 会自动利用更的 CPU 内核(比如双核,四核)* GCD 会自动管理线的生命周期(创建线,调度任务,销毁线序只需要告诉 ,不具备启新线的能力 异步:可以在新的线中执行任务,具备启新线的能力 四、队列的类型 GCD 的队列可以分为 2 大类型 并队列(Concurrent Dispatch Queue) 可以让个任务并 (同时)执行(自动线同时执行任务) 并功能只有在异步(dispatch_async)函数下才有效 串行队列(Serial Dispatch Queue) 让任务一个接着一个地执行(一个任务执行完毕后 ,再执行下一个任务) 五、容易混淆的术语 同步和异步主要影响:能不能启新的线 同步:只是在当前线中执行任务,不具备启新线的能力 异步:可以在新的线中执行任务,具备启新线的能力 并和串行主要影响 :任务的执行方式 并:允许个任务并(同时)执行 串行:一个任务执行完毕后,再执行下一个任务 六、并队列 //创建一个并队列 // label :相当于队列的名字 dispatch_queue_t

    35320

    iOS线-dispatch_set_target_queue

    在GCD线的学习中,我现了dispatch_set_target_queue这个函数。 如果您将一个块提交给一个串行队列,而串行队列的目标队列是一个不同的串行队列,那么该块不会与提交给目标队列或具有相同目标队列的任何其他队列的块并调用。 17.384964+0800 Target[95606:2398989] 2 2019-03-26 11:37:17.385006+0800 Target[95606:2398995] 4 也就是乱序,并执行的 我们在实际中可以使用这种技术避免并执行。 注:若将目标队列targetQueue修改为并队列,则不会有什么实际的效果,还是并执行 dispatch_queue_t targetQueue = dispatch_queue_create("serial

    87610

    iOS之再探线:Grand Central Dispatch详解

    之前关于iOS线的内容布过一篇博客,其中介绍了NSThread、操作队列以及GCD,介绍的不够深入。今天就以GCD为主题来全面的总结一下GCD的使用方式。 GCD在iOS中还是比较重要的,使用场景也是非常的,处理一些比较耗时的任务时基本上都会使用到GCD, 在使用是我们也要主要一些线安全也死锁的东西。 其实并行队列与异步执行方式相结合才能大大的提供效率,因为使用异步执行并行队列时会线来同时执行并行队列中的任务。 下方就是延迟执行的的代码,因为改代码输出结果比较简单,在此就不做过的赘述了。需要注意的是延迟执行会在新辟的队列中进行执行,不会阻塞新的线。 ? 如果你使用dispatch_apply()函数来执行并行队列,虽然会线来循环执行并行队列中的任务,但是仍然会阻塞当前线

    27270

    python线

    Python的线使用标准库threading Thread类 def  __init__(self,group=None,target=None,name=None,args(),kwargs=None enumerate( ) 返回所有活着的线的列表,不包括已经终止的线和未始的线 get_ident( ) 返回当前线的ID,非0整数 import   threading import    getName(),setName()获取,设置这个名词 ident 线ID,它是非0整数,线启动后才会有ID,线退出,仍可以访问,可重复使用 is_alive() 返回线是否存活 线 一个进中如果有线 ,就是线,实现一种并 import   threading import   time  def worker():   count=0   while True:       if(count 一个线可以被join次,timeout是设置等待调用者久,如果没有设置,就一直等待,直到被调用者线结束。

    22910

    iOS14-线

    缺点 线需要占用一定的内存空间,如果启大量的线,会占用大量的内存空间,降低序的性能。 线,CPU 在调度时销就越大。 线 iOS 中的线技术主要分为 3 种,分别为 Thread、GCD 和 Operation。 Thread 面向对象。 需要手动创建线,但不需要手动销毁。 并队列在执行个任务的时候,会线执行。而串行队列不会,它会执行完一个再去执行另外一个。 默认会少个线执行任务。 有两个重要的概念: 临界资源:一次只能允许一个线使用的共享资源。 临界区:访问临界资源的那段代码。 在实际中,经常存在线访问同一个共享资源的情况,那么如何保证线执行结果的正确性?

    23520

    相关产品

    • 云开发 CloudBase

      云开发 CloudBase

      云开发(Tencent Cloud Base,TCB)是腾讯云为移动开发者提供的一站式后端云服务,支持小程序、小游戏、Web、APP开发。它帮助开发者统一构建和管理资源,让开发者可以专注于业务逻辑的实现,而无需理解后端逻辑及服务器运维知识,开发门槛更低,效率更高。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券