简介


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

    • 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源
    • 每个应用程序都有一个主线程,通常用来做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属性判断线程是否被取消
    • 线程同步

      • 原因:多个线程访问同一资源,很可能会引起数据错乱和数据安全问题
      • 解决方案:使用互斥锁来解决互斥资源访问问题,(锁){}对临界资源进行锁定,通常使用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对象实现通信

OC - 19.pthread和NSThread的更多相关文章

  1. iOS---多线程实现方案一 (pthread、NSThread)

    在iOS开发中,多线程是我们在开发中经常使用的一门技术.那么本文章将和大家探讨一下针对于多线程的技术实现.本文主要分为如下几个部分: iOS开发中实现多线程的方式 单线程 pthread NSThre ...

  2. Objective-c——多线程开发第一天(pthread/NSThread)

    一.为什么要使用多线程? 1.循环模拟耗时任务 1.同步执行 2.异步执行 (香烟编程小秘书) 3.进程 系统中正在运行的一个应用程序 每个进程之间是独立的, 均运行在其专用的且受保护的内存空间 通过 ...

  3. 多线程相关(pthread 、NSThread 、GCD、NSOperation)

    进程 进程是指在系统中正在运行的一个应用程序 线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 1个线程中任务的执行是串行的(执行完上一个才能执行下一个) 多线程 1个进程中可以 ...

  4. 多线程(pthread、NSThread、GCD)

    pthread C语言编写 跨平台可移植 线程生命周期需要我们来管理 使用困难 NSThread 面向对象的 可直接操作线程对象 线程生命周期需要我们来管理 使用简单 资源互斥(@synchroniz ...

  5. 多线程 - pthread、NSThread

    1. pthread pthread 简单介绍下,pthread是一套通用的多线程的API,可以Unix / Linux / Windows 等徐彤跨平台使用,使用C语言编写,需要程序员自己管理线程的 ...

  6. OC 线程操作2 - NSThread

        方法1 :直接创建 alloc init - (void)createNSThread111{ /* 参数1: (nonnull id) 目标对象 self 参数2:(nonnull SEL) ...

  7. OC - 19.GCD

    简介 GCD(Grand Center Dispatch)是Apple为多核的并行运算提出的解决方案,纯C语言 更加适配多核处理器,且自动管理线程的生命周期,使用起来较为方便 GCD通过任务和队列实现 ...

  8. 4.1/4.2 多线程进阶篇<上>(Pthread & NSThread)

    本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Githubhttps://github.com/shorfng ...

  9. OC中并发编程的相关API和面临的挑战

    OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...

随机推荐

  1. 设计模式之装饰者模式(Decorator Pattern)

    一.什么是装饰者模式? 装饰者模式能够完美实现“对修改关闭,对扩展开放”的原则,也就是说我们可以在不修改被装饰者的前提下,扩展被装饰者的功能. 再来看看我们的文件操作代码: 1 InputStream ...

  2. POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]

    题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...

  3. Linux Shell编程(9)——特殊变量类型

    局部变量局部变量只在代码块或一个函数里有效 (参考函数里的局部变量)环境变量这种变量会影响Shell的行为和用户接口 在大多数情况下,每个进程都会有一个"环境表", 它由一组由进程 ...

  4. centos升级openssh的两种方式

    此文介绍的是服务器在有网络和无网络情况下升级openssh方式. 一.首先介绍一个无网络如何升级: 1.准备相关的包 openssh下载地址:  http://mirror.internode.on. ...

  5. 数据结构——N皇后放置方法种数

    Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合 ...

  6. Android为应用在桌面添加一个快捷方式

    Intent addIntent=new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); Parcelable ic ...

  7. [Locked] Meeting Room I && II

    Meeting Room Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2 ...

  8. android 客户端 和 新浪微博如何打通的

    微博SDK 为开发者 提供访问oauth2.0 授权认证,并集合sso登录功能,使用第三方应用可通过 新浪微博的 登录操作 提供微博分享功能,可直接通过微博客户端分享微博 名词解释 AppKey 分配 ...

  9. Struts2.xml中result type属性说明

    在struts2配置XML里,result中type属性有以下几种: 1.dispatcher:服务器跳转到前台,后面跟着可以是JSP.htm等等前台页面,默认是这种. 2.redirect:客户端跳 ...

  10. kubernetes kubeadm部署高可用集群

    k8s kubeadm部署高可用集群 kubeadm是官方推出的部署工具,旨在降低kubernetes使用门槛与提高集群部署的便捷性. 同时越来越多的官方文档,围绕kubernetes容器化部署为环境 ...