iOS 개발 다중 스레드(1)

6020 단어
카탈로그
  • 개요
  • NSThread
  • GCD
  • NSOperation
  • 다중 스레드 및 잠금
  • 1. 개요
  • 프로세스
  •                 ,                     。
    
  • 스레드
  •             ,    (  )            ,            。
    
    1             。
    
  • 다중 스레드
  • 1           ,        (  )       。
    
  • 다선정의 원리
  •      ,CPU        ,  1     (  )。
    
    >     (  )  ,   CPU            (  )。
    
      CPU          ,              。
    
  • 멀티스레드 장단점
  • 장점
  • [] 프로그램의 실행 효율을 적당히 높일 수 있습니다.
  • [] 리소스 활용도(CPU, 메모리 활용도) 적절히 향상
  • 결점
  • [] 스레드를 켜려면 일정한 메모리 공간을 차지해야 한다(기본적으로 메인 도시는 1M, 하위 스레드는 1M, 하위 스레드는 512KB), 대량의 스레드를 켜면 대량의 메모리 공간을 차지하고 프로그램의 성능을 떨어뜨린다.
  • [] 스레드가 많을수록 CPU의 스레드 스케줄링 오버헤드가 커집니다.
  • []는 프로그램 개발을 복잡하게 할 수 있다.
  • 기본 스레드
  • 하나의 iOS 프로그램이 실행되면 기본적으로 하나의 스레드가 켜져'주 스레드'또는'UI 스레드'가 됩니다. 주로 UI 인터페이스를 표시하거나 새로 고치고 UI 이벤트를 처리합니다.주의: 비교적 오래 걸리는 조작을 주 라인에 넣지 마십시오
    다중 스레드 구현 방식
  • pthread
  • [] 소개:
    1.        API
    2.  Unix\Linux\Windows   
    3.   \   
    4.     
    
  • C 언어, 루틴 생명주기는 프로그래머가 관리해야 하며, 거의 사용하지 않는다.
  • NSThread
  • [] 소개: 1.를 사용하여 개체를 보다 면밀하게 만듭니다. 2.사용이 간편하고 스레드 개체를 직접 조작할 수 있음
  • OC, 루틴 생명주기는 프로그래머가 관리해야 하며, 간혹 사용
  • GCD(Grand Central Dispatch)
  • [] 소개: 1.NSThread와 같은 기술을 대체합니다. 2.장비의 멀티 코어 활용
  • C 언어, 스레드 수명주기 자동 관리, 자주 사용
  • NSOperation
  • [] 소개:
    1.  GCD(   GCD)
    2. GCD            
    3.        
    
  • OC 언어, 스레드 생명주기 자동 관리, 자주 사용
    NSOperation은 캡슐화 작업을 수행할 수 있는 능력이 없으며 그의 하위 클래스를 사용해야 합니다.
    NSOperation 하위 클래스를 사용하는 3가지 방법
  • [ ] NSInvocationOperation
  • [ ] NSBLockOperation
  • [] 자정의 자류가 NSOperation을 계승하여 내부에 상응하는 방법을 실현한다.

  • 2.NSThread
  • [] 생성, 시작 스레드
  • //  1:         
    NSThread *thread = [[NSthread alloc] initWithTarget:self selectot:@selectot(run) object:nil];
    [thread start];
    
    //  2:         
    [NSthread detachNewThreaSelectot:@selectot(run) toTarget:self withObject:nil];
    
    //  3:           
    [self performSelectInBackground:@selector(run) withObject:nil];
    
  • [] 관련 방법
  • + (NSThread *)mainThread; //      
    - (BOOL)isMainThread; //      
    + (BOOL)isMainThread; //      
    + (NSThread *)currentThread; //       
    //        
    + (double)threadPriorty;
    + (BOOL)setThreadPriorty:(double)p;
    -(double)threadPriorty;
    - (BOOL)setThreadPriorty:(double)p;
    //         0.0~1.0,   0.5,   ,     。
    
    //     
    - (void)setName:(NSString *)n;
    - (NSString *)name;
    
  • [] 스레드 상태 제어
  • //    
    - (void)start;
    //      ->    。         ,        。
    
    //  (  )  
    + (void)sleepUntilDate:(NSDate *)date;
    + (void)sleepForTimeInterval:(NSTimeInterval)ti;
    //      
    
    //      
    + (void)exit;
    //      
    
    **  **       (  ) ,          
    

    3. GCD(Grand Central Dispatch)
    큐의 실행 순서 FIFO(먼저 나가기)
  • [] 동기식 및 비동기식
  • 동기화(sync): 현재 라인에서만 작업을 수행할 수 있으며, 새로운 라인을 열 수 있는 능력이 없음
  • 비동기(async): 새로운 라인에서 임무를 수행할 수 있으며, 새로운 라인을 열 수 있는 능력
  • [] 동시 및 직렬 큐
  • 병렬 대기열: 여러 작업을 동시에 실행할 수 있으며, 병렬 기능은 비동기 함수에서만 유효
  • 직렬 대기열: 작업을 한 번에 하나씩 수행
  • 주의
                     
               
    

    몇 가지 조합 상황
  • async+병렬 대기열
  • 스레드를 생성하여 여러 개를 동시에 열고 퀘스트를 동시에 실행합니다
  • async+직렬 대기열(가끔 사용)
  • 한 라인을 열고 직렬로 실행합니다
  • sync + 직렬 대기열
  • 스레드가 열리지 않음, 직렬 실행
  • sync+병렬 대기열
  • 스레드가 열리지 않음, 직렬 실행
  • async+홈팀열(홈팀에 추가된 작업은 자동으로 홈라인에 실행됨)
  • 스레드 통신에 주로 사용
  • sync+홈팀열(사용 불가)
  • 홈 열에서 직렬 실행, 동기화 함수 서로 기다림, 잠금
    4. NSOperation
    NSOperation 하위 클래스를 사용하는 3가지 방법
  • [ ] NSInvocationOperation
  • [ ] NSBLockOperation
  • [] 자정의 자류가 NSOperation을 계승하여 내부에 상응하는 방법을 실현한다.

  • NSOperationQueue의 고급 사용 방법
    1.        2 
    queue.maxConcurrentOperationCount = 2;
    
    2.    (      )
    【operationB addDependency:operationA];
    【operationC addDependency:operationB];
    
    3.         
    - (void)cancelAllOperations;
    //     NSOperation  - (void)cancel         
    
    4.       
    - (void) setSuspended:(BOOL)b;//YES      ,NO      
    
    5.   
    [NSOperationQueue mainQueue];
    //                ,               
    
    6.    
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        //          
     }];
    

    NSOperation 사용자 지정
       NSOperation      
      - (void)main  ,           
    
      - (void)main      
             (         ,             )
        - (BOOL)isCancelled           ,       
    

    4. 다중 스레드와 잠금
    다중 스레드의 위험
  • 자원 강탈: 한 개의 자원이 여러 라인에 공유되어 자원 경쟁이 발생하고 데이터의 혼란을 초래할 수 있다.

  • 솔루션: 잠금(추가 보완)
  • [x] 상호 배척 잠금:
  • 형식 사용:
    @synchronized(   ){
        //       
    }
    **  :**  1        ,        
    

    상호 배척 자물쇠의 장단점:
    장점: 다중 스레드로 인한 자원 강탈로 인한 데이터 안전 문제를 효과적으로 방지할 수 있다
    단점: 대량의 CUP 리소스를 폐기해야 함
    상호 배척 자물쇠의 사용 전제: 여러 라인이 같은 자원을 빼앗는다
    스레드 간 통신
    //      ,  UI  (      )
    1.[self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];
    2.[self performSelector:@selector(downloadFinished:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
    
              [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
    
      :  waitUntilDone                 
    
    
    //GCD     
    disptach_async(dispatch_get_main_queue(),^{
        //          
    })
    
    
    //NSOperationQueue
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            //          
        }];
        
    
    

    시간을 끌다
    //        sleep,  :      
     1.   [NSThread sleepForTimeInterval:3];
     
     //           ,        
     2.   [self performSelector:@selector(download:) withObject:@"http://555.jpg" afterDelay:3];
    
     // 3            block    
    3.    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), queue, ^{
            NSLog(@"------task------%@", [NSThread currentThread]);
        });
    

    좋은 웹페이지 즐겨찾기