简介


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

    • 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源
    • 每个应用程序都有一个主线程,通常用来做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. ios 写项目的时候遇到的问题及解决方案(3)

    22.看了苹果的文档,里面有这一句话:All launch images must be PNG files and must reside in the top level of your appl ...

  2. HTML字体及颜色设置

    字体(FONT)标记(TAGS) 标题字体(Header) <h#> ... </h#> #=1, 2, 3, 4, 5, 6<h1>今天天气真好!</h1& ...

  3. edittext实现显示千分位格式

    在edittext中你在输入1123456789过程中自动显示为1,123,456,789这种千分位格式的.那么我们该怎么做呢? 查阅Android edittext api发现它有这样一个方法add ...

  4. 解析 .Net Core 注入 (1) 注册服务

    在学习 Asp.Net Core 的过程中,注入可以说是无处不在,对于 .Net Core 来说,它是独立的一个程序集,没有复杂的依赖项和配置文件,所以对于学习 Asp.Net Core 源码的朋友来 ...

  5. 使用navicat连接 mysql时出现client does not support auth...upgrading Mysql Client

    问题报错:使用navicat时发现出现如下情况: 原因:发现是由于navicat版本的问题,出现连接失败的原因:mysql8 之前的版本中加密规则是mysql_native_password,而在my ...

  6. mysql写shell小技巧

    set global general_log=on;set @file=0x653A2F2F7777772F2F782E706870;set global general_log_file=@file ...

  7. day32基于tcp协议的远程执行命令

    客户端 from socket import *import structimport json client = socket(AF_INET, SOCK_STREAM)client.connect ...

  8. [leetcode]449. Serialize and Deserialize BST序列化与反序列化BST

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  9. CM和CDH的安装-进阶完成

    安装Cloudera Manager Server 和Agent 1.在cdh1解压cloudera-manager-el6-cm5.9.0_x86_64.tar.gz(cdh1节点)tar -zcv ...

  10. Tasker : Scale Up/Down CPU Speed at Different Times

    http://techsplurge.com/4926/android-awesome-15-tasker-profiles-tutorials/ Yeah I know, there’s SetCP ...