OC - 19.pthread和NSThread
简介
恰当的使用多线程编程可以提供任务的执行效率和系统资源的利用率
- 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源
- 每个应用程序都有一个主线程,通常用来做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的更多相关文章
- iOS---多线程实现方案一 (pthread、NSThread)
在iOS开发中,多线程是我们在开发中经常使用的一门技术.那么本文章将和大家探讨一下针对于多线程的技术实现.本文主要分为如下几个部分: iOS开发中实现多线程的方式 单线程 pthread NSThre ...
- Objective-c——多线程开发第一天(pthread/NSThread)
一.为什么要使用多线程? 1.循环模拟耗时任务 1.同步执行 2.异步执行 (香烟编程小秘书) 3.进程 系统中正在运行的一个应用程序 每个进程之间是独立的, 均运行在其专用的且受保护的内存空间 通过 ...
- 多线程相关(pthread 、NSThread 、GCD、NSOperation)
进程 进程是指在系统中正在运行的一个应用程序 线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 1个线程中任务的执行是串行的(执行完上一个才能执行下一个) 多线程 1个进程中可以 ...
- 多线程(pthread、NSThread、GCD)
pthread C语言编写 跨平台可移植 线程生命周期需要我们来管理 使用困难 NSThread 面向对象的 可直接操作线程对象 线程生命周期需要我们来管理 使用简单 资源互斥(@synchroniz ...
- 多线程 - pthread、NSThread
1. pthread pthread 简单介绍下,pthread是一套通用的多线程的API,可以Unix / Linux / Windows 等徐彤跨平台使用,使用C语言编写,需要程序员自己管理线程的 ...
- OC 线程操作2 - NSThread
方法1 :直接创建 alloc init - (void)createNSThread111{ /* 参数1: (nonnull id) 目标对象 self 参数2:(nonnull SEL) ...
- OC - 19.GCD
简介 GCD(Grand Center Dispatch)是Apple为多核的并行运算提出的解决方案,纯C语言 更加适配多核处理器,且自动管理线程的生命周期,使用起来较为方便 GCD通过任务和队列实现 ...
- 4.1/4.2 多线程进阶篇<上>(Pthread & NSThread)
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Githubhttps://github.com/shorfng ...
- OC中并发编程的相关API和面临的挑战
OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...
随机推荐
- Unity3D 3D横版跑酷
Unity3d 3D横版跑酷系列(Character Controller组件) @广州小龙 目前在做一个3D跑酷的横版游戏,目前说一下 Character Controller组件! 1.Slop ...
- tomcat服务器报Server at localhost was unable to start within 45 seconds的问题
今天在同一个tomcat服务器下部署了2个不同的应用程序,然后启动时报错:Server at localhost was unable to start within 45 seconds.If th ...
- C++不能中断构造函数来拒绝产生对象(在构造和析构中抛出异常)
这是我的感觉,具体需要研究一下- 找到一篇文章:在构造和析构中抛出异常 测试验证在类构造和析构中抛出异常, 是否会调用该类析构. 如果在一个类成员函数中抛异常, 可以进入该类的析构函数. /// @f ...
- 2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果
原文:2句代码轻松实现WPF最大化不遮挡任务栏并且具有边框调节效果 相信刚入门的菜鸟跟我一样找遍了百度谷歌解决最大化遮挡任务栏的方法大多方法都是HOOK一大堆API声明 最近在敲代码的时候无意中发现有 ...
- Strust2的json插件
以下这段摘自网上: Json是一种轻量级的数据交换格式,JSon插件提供了一种名为json的ActionResultType .一旦为Action指定了该结果处理类型,JSON插件就会自动将Actio ...
- java 实现多种排序
public class Sort { //交换两个数 private void swap(int[] arr, int i,int j){ int temp = a ...
- 同一张表不同SESSION相互持有对方记录引发的死锁
锁产生的原因:如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会发生死锁. 同一张表不同SESSION持有不同记录 SQL> create table t1(id int); Tabl ...
- java学习之函数
讲完了语句结构还有运算符.变量,下面我们来了解下函数. 那么什么是函数,函数的定义是怎样的呢? 函数的定义: 函数是指在类当中定义的一段有特殊功能的代码段,同时函数在类中也被成为方法. class F ...
- Linux企业级开发技术(4)——epoll企业级开发之epoll例程
为了使大家更加深入了解epoll模型在企业应用中的使用,下面给出一段基于epoll的服务器代码,并在代码中添加了详细注释: #include <deque> #include <ma ...
- 动态规划——H 最少回文串
We say a sequence of characters is a palindrome if it is the same written forwards and backwards. Fo ...