iOS OC 学习手册

OC多线程分享pthread&NSThread

2016-07-26  本文已影响0人  ZealPenK

一.多线程基础{

1. 耗时操作:I/O操作:讲数据从内存输入或者输出到外部设备
2. 多线程优,缺点:
优点:{1.能'适当'提高程序的执行效率
      2.能'适当'提高CPU和内存的利用率
      3.线程上的任务完成后,线程会自动销毁,节省内存}
缺点:{1.开启线程需要占用一定的内存空间,如果开启过多线程,就会大量占用CPU资源,降低程序性能
    2.内存占用:子线程512KB,主线程ISO8前1M,后512KB
    3.线程开启越多,CPU调度相差的开销就越大{时间开销/空间开销}
    4.程序设计更加复杂:比如线程间的通信,线程间的数据共享;}

二.pthread{

1.基于C语言的;
2.跨平台可移植;
3.线程生命周期程序员控制;
4.引入头文件:#import <pthread.h>
5.创建方法:pthread_create{
    a.参数1:直线线程标识符的指针:'定义'pthread_t pthread = '使用'&pthread
    b.参数2:线程属性;
    c.参数3:指向新线程的指针(一个方法,或者说需要新线程去执行的地方);
    d.参数4:线程参数;
    e.返回值:BOOL,0表示创建线程成功,反之失败(成功只有一种,失败情况很多种)}
6.桥接:__bridge将OC语言的属性转化为C语言的属性,告诉编译器,这是个C语言属性,不需要内存管理,你啥都不做就行了;}

三.NSThread{

1.基于OC语言,面向对象;
2.可直接操作线程对象;
3.程序呀管理线程生命周期;
4.三种创建方法{
    a.对象创建方法:"可以获得对象,对对象进行操作,需手动启动"
        NSThread *thread = [[NSThread alloc] initWithTarget:self @selector(demo:) object:@"参数"];
        '需手动启动':[thread start];
    b.类的创建方法:"无法获取线程对象,自动开启线程"'detach分离'
        [NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"参数"];
    c.NSObject的分类创建:"无法获取对象,任何NSObject对象都可以创建,自动开启线程"
    [self perfromSelectorInBackground:@selector(demo:) withObject:@"参数"];}
5.线程的生命周期:{
    a.新建:创建线程对象:[[NSThread alloc] initWithTarget];
    b.就绪:将线程放入'可调动释放池',等待CPU调用:[NSThread start];
    c.运行:CPU调度'可调动释放池'中'就绪状态'的线程,线程结束之前,状态会在就绪和运行间来回切换(CPU调度特点,CPU完成,程序员无法干涉);
    d.阻塞:{
        1.休眠指定时间:[NSThread sleepForTimeInterval:1.0];
        2.休眠到指定日期:[NSThread sleepUntilDate:[NSDate dateWith]];
        3.互斥锁:@synchronized'只能有一个线程访问这个属性,其他线程会阻塞等待访问结束'}
    e.死亡:正常死亡:线程执行结束 非正常死亡:程序崩溃/满足某个条件后,线程内部强制退出,调用"exit"("主线程中严禁调用exit")
    f.重要注意:{
        1."主线程中严禁调用exit"
        2."[NSThread exit]方法会停止当前线程"
        3."在调用[NSThread exit]方法前,一定要释放之前C语言框架创建的对象"
        "CGMutablePathRef path = CGPathCreateMutable()"
        "CGPathRelease(path);"}}
6.线程属性:{
    1.name:线程名称,用来定义BUG位置
    2.threadPriority:线程优先级,浮点数0~1,1最高,默认0.5,只CPU决定调用频率,最好不要修改;
    3stackSize:栈区大小:默认512KB,最新哦啊16KB,必须是4KB的整数打印时候/1024;}
7.线程安全:{
    1.互斥锁/同步锁:{'单写&单读'
        a.可以保证被锁定的代码,同一时间,只能有一个线程可以操作;
        b.任何NSObject的对象,都是可以所对象,你饿不都有一把锁,big切默认是开着的;
        c.锁对象:一定要全局锁对象,保证所有的线程都能访问(self是最方便的所对象)
        d.互斥锁的范文应该尽量小,但一定要锁住资源的'读写'部分
        e.加锁后程序效率比不加锁要"低",因为线程要等待解锁,牺牲了性能保证安全性;}
上一篇下一篇

猜你喜欢

热点阅读