zoukankan      html  css  js  c++  java
  • 漫谈多线程(二)

    一.多线程实现方案

    1>pthread

      1)语言:C语言

      2)特点: (1)通用的多线程API

          (2)适用于UnixLinuxWindows等

          (3)跨平台可移植

          (4)使用难度大

      3)生命周期:程序员管理 

    示例:

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        //1.创建一个pthread对象
        pthread_t thread;
        
        //2.创建线程
        /*
         第一个参数:线程对象,需要传地址
         第二个参数:线程的一些属性,可以传NULL
         第三个参数:该线程创建后要调用的方法,注意这里是一个指向函数的指针
         第四个参数:第三个参数(函数指针)中接收的参数,如果没有那么传NULL
         */
        pthread_create(&thread, NULL, run, NULL);
        
        pthread_t thread2;
        pthread_t thread3;
        pthread_create(&thread2, NULL, run, NULL);
        pthread_create(&thread3, NULL, run, NULL);
    }
    
    void *run(void * param)
    {
        NSLog(@"--run--%@",[NSThread currentThread]);
        return NULL;
    }

     

    2>NSThread

      1)语言:OC语言

      2)特点: (1)可以对线程状态操作,简单易用

          (2)使用更加面向对象

      3)生命周期:程序员管理

    注意的地方:

     1)创建线程的四种方法 alloc initwith..|detachNewThread|performSelectorInBack..|自定义

     2)设置线程的属性(名称&优先级[0.0~1.0])

     3)NSThread创建线程的生命周期:当任务执行完毕的时候被释放

    3>GCD(任务+队列)

      1)语言:C语言

      2)特点: (1)能够充分利用设备多核,并且是自动的

          (2)旨在替代NSThread等线程技术

      3)生命周期:自动管理

    注意的地方:

    1)全局并发队列,是系统自带的队列,需要的时候调用即可,一共有四种,它们的优先级是默认存在的.苹果官方文档指出,栅栏函数对它们无效.

    2)主队列,凡是添加到主队列中的任务都是在主线程中执行的.

    3)使用步骤:封装任务-->把任务丢给队列,系统会按照FIFO原则把任务给对应的线程处理

    4)同步函数+串行队列 -->不会开线程,所有的任务串行执行

       同步函数+并发队列 -->不会开线程,所有的任务串行执行

       同步函数+主队列 -->死锁(因为主队列调度任务时会先检查主线程状态,如果主线程发现忙着会暂停调度,所以这种情况会死锁)

       异步函数+串行队列 -->会开一条线程,所有的任务串行执行

       异步函数+并发队列 -->会开多条线程,所有的任务并发执行

       异步函数+主队列 -->不会开线程,所有的任务串行执行

    5)iOS6.0之前,creat一次就release一次.iOS6.0之后纳入ARC管理

    6)其他常用函数

      ①栅栏函数-->用来控制任务的执行顺序,但是不能用全局并发队列(苹果官方文档是这样说明的)

      ②一次性函数-->整个程序运行中,一次性代码只执行一次,可以用来实现单例模式(注意,不能放到懒加载中)

      ③延迟执行

      ④快速迭代(注意不能使用主队列)

      ⑤队列组的使用

    4>NSOpreation(操作+队列)

      1)语言:OC语言

      2)特点: (1)它的底层是基于GCD,比GCD多了一些简单实用功能

          (2)使用更加面向对象

      3)生命周期:自动管理

    注意的地方:

    1)NSOperation用来封装操作,NSOpreationQueue用来存放任务

    2)实现步骤:封装操作--->把操作添加到队列

    3)对于NSBlockOperation,可以追加任务,如果一个操作中有多个任务,那么会开子线程,但不一定在子线程中处理

    4)自定义NSOpreation --->重写内部的Main方法,有利于代码的封装和复用

    5)非主队列同时具备串行和并发功能,默认是并发队列,通过控制最大并发数来实现

    6)把操作添加到队列中的方法内部会自动调用start方法

    7)队列的挂起:YES-->暂停  , NO-->继续;(挂起只能挂起当前非处于执行状态的任务)

    8)队列的取消:取消不可恢复;(苹果官方建议,如果是自定义的NSOpreation,每执行完一段耗时操作,就检查当前操作是否取消)

    9)操作的依赖和监听:可以跨队列依赖,注意不要循环依赖就好了

                                                                    2016-5-22   奈文摩尔

         

  • 相关阅读:
    BZOJ3277: 串(广义后缀自动机)
    BZOJ3998: [TJOI2015]弦论(后缀自动机)
    SPOJ7258 SUBLEX
    洛谷P3808 【模板】AC自动机(简单版)
    SPOJ8222 NSUBSTR
    BZOJ2946 [Poi2000]公共串(后缀自动机)
    Codeforces Round #490 (Div. 3)
    SPOJ1811 LCS
    洛谷P3804 【模板】后缀自动机
    list排序成员函数对string对象与char*对象排序的差别
  • 原文地址:https://www.cnblogs.com/naiwenmoer/p/5516066.html
Copyright © 2011-2022 走看看