简介


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

    • 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源
    • 每个应用程序都有一个主线程,通常用来做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. MFC重绘函数:InvalidateRect(), Invalidate()和UpdateWindow()

    1. 重绘消息 当需要更新或者重绘窗口时,一般系统会发出两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化) WM_NCPAINT系统会自己搞定 WM_PAINT消 ...

  2. Nodejs in Visual Studio Code 14.IISNode与IIS7.x

    1.开始 部署IISNode环境请参考:Nodejs in Visual Studio Code 08.IIS 部署Nodejs程序请参考:Nodejs in Visual Studio Code 1 ...

  3. Palindrome - POJ 3974 (最长回文子串,Manacher模板)

    题意:就是求一个串的最长回文子串....输出长度. 直接上代码吧,没什么好分析的了.   代码如下: ================================================= ...

  4. sql server常用查询

    最近在做一些练习,觉得数据的查询是一个很有意思的,在做的过程中一些好的查询方法也使自己感觉到数据库的强大,于是乎就会想到要把这些方法记下来,以后就懒得再去想了 1.查询是整百的倍数 SELECT 实缴 ...

  5. ios中键值编码kvc和键值监听kvo的特性及详解

    总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  ...

  6. dede 留言簿 多个

    使用后台的[模块]-[模块生成向导],然后填写一下资料 PS:complaints 是之前做的一个"举报投诉"的留言簿意思,这里用作非常多文件名称和新建数据表的名字,所以替换就可以 ...

  7. Android自动化测试之Monkey工具

    前言:Android自动化测试工具.方法和框架,包括android测试框架.CTS.Monkey.Monkeyrunner.benchmark.test tool等. 一. 什么是MonkeyMonk ...

  8. 一个站点的诞生06-- ORM

    站点上的数据,存在数据库里. 一般用Mysql,也实用sqlite,Postgre.操作数据库要会SQL语言,这个有点麻烦,经常须要查手冊. 此外.每家数据库在实现SQL语言的时候,经常会加料,添加一 ...

  9. ping and traceroute(tracert)

    1.ping程序简单介绍 这个程序是Mike Muuss编写的.目的是測试另外一台机子是否可达. 运用的协议就是ICMP.运用的是ICMP的回显应答和请求回显两个类型.曾经呢.能ping通说明可以进行 ...

  10. Qt 学习之路 :事件

    事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事 ...