设为首页 加入收藏

TOP

iOS多线程技术方案(一)
2017-10-12 18:08:09 】 浏览:7268
Tags:iOS 线程 技术 方案

iOS多线程技术方案

目录

一、多线程简介

1、多线程的由来
2、耗时操作的模拟试验
3、进程和线程
4、多线程的概念及原理
5、多线程的优缺点和一个Tip
6、主线程
7、技术方案
二、Pthread
---
1、函数
2、参数和返回值
3、使用
三、NSThread
---
1、创建一个新的线程
2、线程的状态
3、线程的属性
四、互斥锁
---
1、访问共享资源引入问题!
2、互斥锁介绍
3、互斥锁原理
4、互斥锁和自旋锁
五、GCD
---
1、GCD介绍
2、GCD的两个核心
3、函数
4、串行队列和并发队列
5、主队列
6、全局队列
7、GCD总结
六、NSOperation
---
1、NSOperation简介
2、核心概念
3、操作步骤
4、NSInvocationOperation
5、NSBlockOperation
七、案例
---
***

一、多线程简介

1、多线程的由来

一个进程(进程)在执行一个线程(线程中有很多函数或方法(后面简称Function))的时候,其中有一个Function执行的时候需要消耗一些时间,但是这个线程又必须同时执行这个Function之后的Function,问题来了,一个线程中的任何一个Function都必须等待其执行完成后才能执行后面的Function,如果要同时执行两个或者多个Function,那么,就必须多开一个或者多个线程,这就是多线程的产生。我想多线程最开始的诞生就是由这而来吧!

2、耗时操作的模拟试验

2.1 循环测试

代码

int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSLog(@"bengin");
    for (int i = 0; i < 10000000; i++) {
    }
    NSLog(@"end");
}
return 0;
}

控制台

2016-02-16 13:51:54.140 Test[1670:603696] bengin
2016-02-16 13:51:54.160 Test[1670:603696] end
Program ended with exit code: 0

结论一:循环一亿次耗时0.02秒,计算机的运行速度是非常快的

2.2 操作栈区

代码

int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSLog(@"bengin");
    for (int i = 0; i < 10000000; i++) {
        int n = 1;
    }
    NSLog(@"end");
}
return 0;
}

控制台

2016-02-16 13:57:37.589 Test[1734:631377] bengin
2016-02-16 13:57:37.612 Test[1734:631377] end
Program ended with exit code: 0

结论二:对栈区操作一亿次,耗时0.023秒

2.3 操作常量区

代码:

int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSLog(@"bengin");
    for (int i = 0; i < 10000000; i++) {
        NSString *str = @"hellow";
    }
    NSLog(@"end");
}
return 0;
}

控制台

2016-02-16 14:03:59.003 Test[1763:659287] bengin
2016-02-16 14:03:59.113 Test[1763:659287] end
Program ended with exit code: 0

结论三:对常量区操作一亿次,耗时0.11秒

2.4 操作堆区

代码

int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSLog(@"bengin");
    for (int i = 0; i < 10000000; i++) {
        NSString *str = [NSString stringWithFormat:@"%d",i];
    }
    NSLog(@"end");
}
return 0;
}

控制台

2016-02-16 14:09:03.673 Test[1786:673719] bengin
2016-02-16 14:09:10.705 Test[1786:673719] end
Program ended with exit code: 0

结论四:对堆区操作一亿次耗时7秒多一些,较慢!

2.5 I/O操作

代码

int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSLog(@"bengin");
    for (int i = 0; i < 10000000; i++) {
        NSLog(@"%d",i);
    }
    NSLog(@"end");
}
return 0;
}

控制台输出!正在跑中,一亿次!!!先看截图
CPU
1
再看内存

1
好吧,还在跑,现在已经达到10分钟了,怕心疼本本炸掉!stop。。。
结论五:I/O操作非常慢,一亿次10分钟也没能跑完!

最终结论:通过以上结论一、二、三、四、五得出一个结论,各个区的执行效率:栈区>常量区>堆区>I/O操作。同时也说明了一个问题,执行不同的方法会产什么耗时操作。这是,为了解决耗时操作问题,多线程闪亮诞生!

3、进程和线程

先说说进程和线程吧!

3.1 进程

3.1.1 进程的概念:系统中正在运行的应用程序。

3.1.2 进程的特点:每个进程都运行在其专用且受保护的内存空间,不同的进程之间相互独立,互不干扰。

3.2 线程

3.2.1 线程的概念:线程是进程的执行任务的基本单元,一个进程的所有任务都是在线程中执行的。(每一个进程至少要有一条线程)。

3.2.2 线程的特点:线程在执行任务的时候是按顺序执行的。如果要让一条线程执行多个任务,那么只能一个一个地并且按顺序执行这些任务。也就是说,在同一时间,一条线程只能执行一个任务。

我们可以通过Mac中的活动监视器查看进程和线程,下图!
1

4、多线程的概念及原理

4.1 多线程概念:1个进程可以开启多条线程,多条线程可以同时执行不同的任务。

4.2 多线程原理:

1

前提是在单核CPU的情况下,同一时间,CPU只能处理一条线程,也就是说只有一条线程在执行任务。多线程同时执行,那是不可能的!但是是CPU快速地在多条线程之间进行调度和切换执行任务。如果CPU调度线程的速度足够快,就会造成多条线程同时执行任务的”假象”,这种假象,就被美誉为:多线程!

5、多线程的优缺点和一个Tip

5.1 多线程的优点

  • 可以适当提高程序的执行效率
  • 也可以适当提高资源的利用率(CPU、内存利用率)

    5.2 多线程的缺点

  • 开启一条线程需要占用一定的内存空间(默认情况下,每一条线程都占用512KB),如果开启大量的线程,会占用大量的内存空间,从而降低程序的性能。
  • 线程越多,CPU在调度和切换线程上的开销就会越大。
  • 线程数越多,程序

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基于OpenSSL的RSA加密应用(非算法) 下一篇在uiview里面的tableView中,点击..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目