iOS开发程序员首页投稿(暂停使用,暂停投稿)

01-iOS多线程

2016-07-09  本文已影响180人  岁与禾

1 多线程

1.1 概念

1.2 多线程的实现原理

问题:如果线程太多,会怎么样?
答:CPU频繁切换,消耗资源。每个线程都要占内存,消耗内存。一般建议3条,不超过5条

1.3 主线程和子线程

1.4 多线程在iOS中实现方式

实现方式 | 使用语言 | 优势 | 使用频率
------------ | ------------- | ------------
pthread | 纯C语言 | 跨平台linux/unix/windows | 几乎不用
NSThread | OC | 更面向对象,创建销毁程序员自己管理 | 偶尔使用
GCD | 纯C语言 | 苹果用来取代NSThread,创建销毁系统管理| 经常使用
NSOperation|OC语言|底层是GCD,更面向对象,创建销毁系统管理|经常使用

2 pthread方式

1 导入头文件
  #import <pthread.h>

2 创建线程
  * @param restrict 就像线程的表示符一样,传入指针
  * @param restrict 传空值就可以额
  * @param download 线程调用的函数,返回值为 void * , 参数为void *

 pthread_t param1;
 pthread_create(&param1, NULL, download, NULL);
 
3 执行子线程任务
void * download(void *p)
{
    NSLog(@"正在开始下载");
    for (int i=0; i<10000; i++) {
    NSLog(@"--------%d",i);
    }
    return NULL;
}

3 NSThread方式

3.1 创建和启动方式

3.2 常见方法

4 线程的状态

5 线程的同步(多线程安全性问题)

5.1 举例(卖票问题)

    有三个窗口,都将剩余票数读出来,然后各自减1,然后再覆盖剩余票数。就可能实际卖出去的票数大于应有的票数。

5.2 互斥锁(同步锁)

为了防止多线程请求同一个资源,导致出现冲突,引入了加锁的概念。可以使用@synchronize关键字来对资源加锁,从而避免多个线程抢占同一个资源。

5.2.1 语法规则

@syschronize(self)
{
    
}
大括号里面的内容就是会出现冲突的资源操作。self表示的是锁头,表示一把锁,整个程序中只能出现一把锁。锁头用来存储上一次加锁的状态。任何对象都能作为锁头,为了唯一性,我们一般用当前对象self来表示锁头。当线程加锁后,另一个线程执行到这个位置的时候,就会被阻塞,直到自己获取互斥锁。

我们引入一个慨念:线程同步。就是多个线程并行执行到某个地方的时候,通过加锁,使的线程串行执行。

5.3 属性原子性操作

我们在OC中定义属性的时候,经常会使用nonatomic来定义。这就是非原子性。当我们使用atomic来定义属性的时候,就会在属性的setter方法中加一把锁,从而多个线程请求同时修改这个参数。------需要注意,这个锁不是互斥锁。
但实际在iOS开发中,基于以下几个方面的原因,我们一般采用nonatomic.

上一篇 下一篇

猜你喜欢

热点阅读