多線程相關

1. GCD

1. 同步/異步 串行/併發
dispatch_sync(serial_queue, ^{//任務})

dispatch_async(serial_queue, ^{//任務})

dispatch_sync(concurrent_queue, ^{//任務})

dispatch_async(concurrent_queue, ^{//任務})
複製代碼

  • 死鎖
    • 緣由
      • 隊列引發的循環等待
      • 主隊列中所提交的任務不管是同步方式仍是異步方式,都要在主線程中執行
      • 同步提交的任務,不管是提交到併發仍是串行隊列,都在當前線程執行

2. dispatch_barrier_async
  • 併發隊列實現多讀單寫
3. dispatch_group
// 建立一個group
    dispatch_group_t group = dispatch_group_create();
    
    // for循環遍歷各個元素執行操做
    for (NSURL *url in arrayURLs) {
        
        // 異步組分派到併發隊列當中
        dispatch_group_async(group, concurrent_queue, ^{
            
            //根據url去下載圖片
            
            NSLog(@"url is %@", url);
        });
    }
    
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 當添加到組中的全部任務執行完成以後會調用該Block
        NSLog(@"全部圖片已所有下載完成");
    });
複製代碼

2. NSOperation

配合NSOperationQueue實現多線程方案
  • 特色
    • 能夠添加任務依賴
    • 任務執行狀態控制
      • 狀態
        • isReady
        • isExecuting
        • isFinished
        • isCancelled
      • 若是隻重寫main方法,底層控制變動任務執行完成狀態,以及任務退出
      • 若是重寫了start方法,自行控制任務狀態
    • 最大併發量
    • 支持KVO

3. NSThread

  • 啓動流程
  • 結合Runloop實現常駐線程
  • Start方法

4. 多線程與鎖

  • iOS中的鎖
    • @synchronized
      • 通常在建立單例對象的時候使用
    • atomic
      • 修飾屬性的關鍵字
      • 對被修飾對象進行原子操做(不負責使用)
    • OSSpinLock
      • 自旋鎖
      • 循環等待詢問,不釋放當前資源
      • 用於輕量級數據訪問,簡單的int值+1/-1操做
    • NSLock
    • NSRrecursiveLock - 遞歸鎖
    • dispatch_semaphore_t - 信號量
      • dispatch_semaphore_create(1)
        • 內部實現
      • dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
        • 內部實現邏輯
      • dispatch_semaphore_signal(semaphore)
        • 內部
相關文章
相關標籤/搜索