简介


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

    • 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源
    • 每个应用程序都有一个主线程,通常用来做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. TransactionScope IsolationLevel 事务隔离级别

    事务有四个特性 第一原子性,事务具有独立的不能被拆分的,不能只做部分,事务的性质是要么全做,要么都不做. 第二统一性,在事务执行之前和事务执行之后的数据是一致. 第三隔离性,事务是独立的,开发者不能查 ...

  2. Linux on Power 上的调试工具和技术

     Linux on Power 上的调试工具和技术 简介: 调试是一项主要的软件开发活动,作为应用程序开发人员,您无法避免对程序进行调试.有效的调试不仅能缩短软件开发周期,而且可以节省成本.本文简要介 ...

  3. 吉哥系列故事――临时工计划(dp)

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Descr ...

  4. n数码问题, 全排列哈希

    转载了一篇关于全排列的哈希函数,Poj1077就是应用了全排列的哈希: 我们经常使用的数的进制为“常数进制”,即始终逢p进1.例如,p进制数K可表示为    K = a0*p^0 + a1*p^1 + ...

  5. Missing Number ——LeetCode

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  6. cf602A Two Bases

    A. Two Bases time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  7. GitHub上传不了的解决 ssh: connect to host github.com port 22: Bad file number git did not exit cleanly (exit code 128)

    问题情况 本来一直用的是github的客户端,结果现在上传的时候出问题了,去网站上看,新项目已经创建,但是代码却怎么都上传不上去.于是只好用命令行的方式解决. Tortoisegit上是这样说的: g ...

  8. Substrings - HDU 1238(最大共同子串)

    题目大意:给你N个串,求出来他们的最大公共子串的长度(子串反过来也算他们的子串).   分析:很久以前就做过这道题,当时是用的strstr做的,不过相同的都是枚举了子串......还是很暴力,希望下次 ...

  9. poj2299

    好吧,看到这个图片就知道是干什么的了,求逆序数- - 可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- - 基本上都忘了,再写一写试试吧. AC ///////////// ...

  10. poj4474 Scout YYF I(概率dp+矩阵快速幂)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4100   Accepted: 1051 Descr ...