简介


  • 恰当的使用多线程编程可以提供任务的执行效率和系统资源的利用率

    • 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源
    • 每个应用程序都有一个主线程,通常用来做UI界面刷新等
    • 比较耗时的任务如果放在主线程中,可能会造成主线程的堵塞,无法响应用户操作,通常为耗时任务创建自己的线程,与主线程并发执行
  • 多线程编程在一定程度上提高了系统资源的利用率和任务处理速度,但是线程不易过多,否则会引发以下问题。
    • 过多的线程会造成处理机的频繁调度,线程调度需要消耗大量的系统资源。
    • 同一进程下的多个线程共享进程的资源,多个线程对资源的访问需要实现同步,若线程过多会增加同步的难度,甚至无法实现。

iOS开发中实现多线程的方式


  • pthread

    • 跨平台,适用于多种操作系统,可移植性强
    • 是一套纯C语言的通用API,且线程的生命周期需要程序员自己管理,使用难度较大,通常不使用
  • NSThread
    • 基于OC语言的API,使得其简单易用,面向对象操作
    • 线程的声明周期由程序员管理,偶尔使用
  • GCD
    • 基于C语言的API,充分利用设备的多核,旨在替换NSThread等线程技术
    • 线程的生命周期,由系统自动管理,经常使用
  • NSOperation
    • 基于OC语言API,底层是GCD,增加了一些更加简单易用的功能,使用更加面向对象
    • 线程生命周期由系统自动管理,经常使用

pthread


  • 创建线程

    • 定义线程变量:

      • pthread_t thread
    • 初始化线程变量:
      • pthread_create(&thread, NULL, run, NULL)
  • 设置/获取线程的并发执行数
    • 设置并发执行数:

      • int pthread_setconcurrency(int)
    • 获取线程的并发执行数:
      • int pthread_getconcurrency(void)
  • 执行单次任务(通常用来设计单例模式)
    • 定义标记:

      • pthread_once_t onceToken
    • 执行单次任务:
      • int pthread_once(pthread_once_t *, void (*)(void))
  • 将线程状态转化为unjoinable状态,确保资源的释放
    • int pthread_detach(pthread_t)
  • 退出线程
    • void pthread_exit(void *)

NSThread


  • 线程的生命周期操作

    • 创建线程的方法

      • - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument,此方法创建的线程需要手动启动
      • + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument,创建线程后自动启动
      • - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg,隐式创建线程并启动
    • 配置线程
      • 通过name属性设置线程名字
      • + (BOOL)setThreadPriority:(double)p设置线程的优先级
    • 启动线程
      • - (void)start
    • 阻塞线程
      • + (void)sleepUntilDate:(NSDate *)date
      • + (void)sleepForTimeInterval:(NSTimeInterval)ti
    • 取消线程
      • - (void)cancel,当前正在执行的线程不会立刻停止
    • 强制退出线程
      • + (void)exit
  • NSThread的其他操作

    • 与主线程相关

      • + (NSThread *)mainThread,获取主线程
      • + (BOOL)isMainThread,判断当前线程是不是主线程
    • 与当前线程相关
      • + (NSThread *)currentThread,获取当前线程
    • 判断线程的状态
      • \通过executing属性判断线程是否正在执行
      • \通过finished属性判断线程是否执行完毕
      • \通过cancelled属性判断线程是否被取消
  • 线程同步
    • 原因:多个线程访问同一资源,很可能会引起数据错乱和数据安全问题
    • 解决方案:使用互斥锁来解决互斥资源访问问题,iOS中通常使用@synchronized(锁){}对临界资源进行锁定,通常使用self作为锁
    • 注意:由于线程同步会消耗大量的资源,应尽量避免多个线程访问同一资源,且通常将线程同步的逻辑交由服务器端实现
  • 线程之间的通信
    • 从子线程回到主线程

      • - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array

        • array指定runLoop的模式,若为空,则不执行aselector
        • 方法的调用者即为aselector的调用者
      • - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
    • 从一个线程到另一个线程(包括主线程)
      • - (void)performSelector:(SEL)aSelector onThread:(NSThread )thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray )array
      • - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait
    • 也可以通过NSPort对象实现通信

iOS多线程-01-pthread与NSTread的更多相关文章

  1. iOS多线程知识总结--GCD

    iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...

  2. iOS多线程--深度解析

    多线程 你们项目中为什么多线程用GCD而不用NSOperation呢? 你有没有发现国外的大牛他们多线程都是用NSOperation? 你能告诉我他们这样做的理由吗? 关系: ①:先搞清两者的关系,N ...

  3. iOS多线程知识梳理

    iOS多线程知识梳理 线程进程基础概念 进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 线程 1个进程要想执行任务,必须得有线程(每1个 ...

  4. iOS 多线程知识梳理

    #iOS多线程知识梳理 ##线程进程基础概念 ###进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 ###线程 1个进程要想执行任务,必须 ...

  5. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  6. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  7. 关于iOS多线程的总结

    关于iOS多线程的总结   在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇 ...

  8. [iOS 多线程 & 网络 - 1.0] - 多线程概述

    A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活 ...

  9. iOS多线程拾贝------操作巨人编程

    iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命 ...

  10. iOS多线程编程--NSOperation(转)

    这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github. ...

随机推荐

  1. PhoneCat App 教程

    https://docs.angularjs.org/tutorial AngularJS教程第一篇文章的翻译,因为我在看中文版的AngularJS的翻译的时候,发现第一篇文章翻译的不准确,很有可能是 ...

  2. Python - 属性简介"__name__"

    模块是对象,并且每个模块都有一个内置属性__name__.当一个模块被直接运行的时候,该模块__name__的值就等于缺省的'__main__'.如果一个模块被import ,那么这个被引入模块__n ...

  3. 求1+2+3+...+n

    求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 卧槽,剑指Offer竟然有这样的题... public ...

  4. VueJs2.0建议学习路线

    最近VueJs确实火了一把,自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新手来说,如何高效快速的学习Vue2.0呢. 既然大家会看这篇文章,那么 ...

  5. C++中指针和引用的区别

    ①指针可以为空,引用不能为空: ②指针可以被赋值,引用必须在声明时赋值,之后不能被赋值: ③指针可以指向堆中空间,引用不能指向堆中空间,如int &p=new int; 会编译出错.

  6. mysql线上一些隐患查询sql

    开发写了几个语句,觉得查询结果跟逻辑有点不相符,就拿到这里一起分析了下. 语句如下: select tp.title, tp.amount, ifnull( ) as aInvestAmount, i ...

  7. servlet、filter、listener、interceptor之间的区别和联系

    一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...

  8. P6 EPPM 安装与配置指南 16 R1 2016.4

       关于安装和 配置P6 EPPM 本指南告诉你如何自动 安装和配置您的应用程序. 在您开始之前,阅读 先决条件 P6 EPPM配置 (7页). 安装P6 EPPM 您将使用 安装程序 (窗口) . ...

  9. 【iOS】编译静态库

    与java和.net一样,objc也由类库的概念,不过在在objc上一般叫库,库表示程序代码集合,可以共享给其他程序使用,库是编译后的二进制文件,因此不能看到源代码,多用于一些开放sdk(如百度地图s ...

  10. 用C#开发的双色球走势图(二)

    昨晚由于时间的原因只写了一部分内容,今天将这一部分内容补充完毕,多谢各位园友的支持. 这是用C#开发的双色球走势图(一)新的园友可以看昨晚写的内容,以免脱节.首先回复园友的评论,有说好的有说不好的,本 ...