多线程的几种模型

多线程的几种模型

1.对多线程的理解

多线程在iOS中用的很多,比如每个asi请求,sdwebimage请求,数据请求,等待网络数据处理,多线程/异步就是为了界面流畅,防止假死,
每一个ASI请求就是一个NSOperation
每一个NSUrlConnection也是一个线程
NSThread是创建线程的一个通用的类,比如创建线程,取消,开始等
NSOperation就是一个简单地以任务为向导的多线程模型,目的是为了不懂操作系统,不懂线程的人使用的
GCD类似于NSOperation,是一个blocks版本的线程模型

苹果公司的Cocoa框架共支持三种多线程机制,分别为NSThread、GCD(Grand Central Dispatch)、Cocoa NSOperation。NSThread是官方推荐的线程处理方式,它在处理机制上,需要开发者负责手动管理Thread的生命周期,包括子线程与主线程之间的同步等。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread。 比其他两个量级轻 需要自己管理线程的生命周期,线程同步。 线程同步对数据的加锁会有一定的系统开销

如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,它看起来象就其它语言的闭包(Closure)一样,但苹果把它叫做blocks。

2.多线程的几种实现方式

1.pthread 底层C线程库
2.NSThread OC线程库
3.NSOperationQueue 线程池/线程队列
4.Blocks/GCD Blocks模式的 线程池

NSThread:优点:比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销

————1. pthread——————

/**
* 创建一个线程、该函数不会阻塞、线程创建成功不代表线程已经运行。
*
* @param thread 输出参数——带出一个线程ID(线程ID的类型为 pthread_t)
* @param attr 线程的属性、如果穿NULL、表示按系统默认属性创建线程
* @param start_routine 是一个函数指针、它所指向的函数就是即将要创建的线程的执行路径。
* @param arg 函数指针start_routine所指向的函数的实参
*
* @return 0表示创建线程成功、否则失败。
*/
//int pthread_create(pthread_t restrict thread, const pthread_attr_t *restrict attr, void (start_routine)(void ), void *restrict arg);
void* thread1_main(void* arg)
{
int i=0;
while(1)
{
printf(“111”);
}
}

int main(int argc,const char* argv[])
{
pthread_t tid;
int ret=0;
ret = pthread_create(&tid,NULL,thread1_main,NULL);
if(ret != 0)
{
perror(“ pyhread_create err”);
}
int i=0;
while(1)
{
printf(“main i=%d\n”,i++);
}
return 0;
}

———2. NSthread——————
NSThread总共有两种方法来创建线程
1. [NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
2. NSThread* myThread=[[NSThread alloc]initWithTarget:self
selector:@selector(doSomething:)
object:nil];
[myThread start];
第一种方式会直接创建线程并且开始运行线程,第二种方法是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息.

PS:不显示创建线程的方法:
用NSObject的类方法performSelectorInBackground:withObject:创建一个线程
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

比如说这里模仿一个图片下载的过程,
-(void)downLoa

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值