溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

IOS開發-多線程隊列測試代碼

發布時間:2020-08-25 09:38:30 來源:腳本之家 閱讀:152 作者:chenhh6701 欄目:移動開發

直接貼測試代碼了。

當前考慮的問題:
1.隊列有多少個消費者
2.添加到隊列的新task是同步運行(當前線程阻塞)還是異步(當前線程不阻塞)
3.多個隊列之間的調度(此文章未涉及)

//
// 單線程和多線程并發隊列測試(同步和異步)
//
// 基礎原理:
// 1)隊列:
//  1.1 dispatch_queue_t 是一個隊列,一個FIFO的消費隊列
//  1.2 消費者:隊列配置的運行線程
//  1.3 被消費對象: 添加到隊列中的運行任務(block等)
//  1.4 運行任務:將任務放到隊列中,等待消費者消費
// 2)同步,異步  (對于任務) (此處的運行指將任務發入到請求隊列中)
//  2.1 同步:A任務在運行時,插入B任務,A任務等待B任務運行完才能運行
//  2.2 異步: A任務在運行時,插入B任務,A任務不等待并且繼續運行,B任務也運行
// 假設:
// ATask: 運行fooA的Block
// BTask: 運行fooB的Block
//
//
// 總結:
// 不管單線程或多線程,同步或異步,一定要聯系請求隊列考慮



#import "TestQueueSi.h"

@interface TestQueueSi ()

@property (strong,nonatomic) dispatch_queue_t serialQueue;
@property (strong,nonatomic) dispatch_queue_t concurrentQueue;

@end

@implementation TestQueueSi


- (instancetype)init {
  self = [super init];
  if(self) {
    _serialQueue = dispatch_queue_create("chenhh.serialQueue", DISPATCH_QUEUE_SERIAL);
    _concurrentQueue = dispatch_queue_create("chenhh.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

  }
  return self;
}

/**
 QUEUE_SERIAL(單線程) 同步
 死鎖崩潰
 
 1.ATask運行,同步加入BTask
 2.BTask加入到請求隊列中,可是沒有其他空余線程(ATask線程在 等待BTask),BTask等待空余線程,
 3.死鎖發生
 
 */
- (void)testSerialQueueSync {
  dispatch_sync(_serialQueue,^{
    [self fooA];
    dispatch_sync(_serialQueue,^{
       [self fooB];
    });
    [self fooA];
  });
}

/**
 QUEUE_CONCURRENT(多線程) 同步
 正常運行

 1.ATask運行,同步加入BTask,Atask線程等待
 2.BTask加入到請求隊列中,有其他空余線程(ATask線程在等待BTask),BTask運行
 3.BTask運行結束,ATask停止等待,繼續運行
 
 */
- (void)testConcurrentQueueSync {
  dispatch_sync(_concurrentQueue,^{
    [self fooA];
    NSLog(@"first");
    
    // 同步 需要等待運行結果
    dispatch_sync(_concurrentQueue,^{
      [self fooB];
    });
    
    // 等待同步代碼完成,再運行
    [self fooA];
  });
}

/*
 QUEUE_SERIAL(單線程) 異步
 正常
 
 
 1.ATask運行,異步加入BTask,Atask線程繼續運行不等待
 2.BTask加入到請求隊列中,沒有其他空余線程(ATask線程在正常運行),BTask等待空余
 3.ATask運行完成,線程空出,BTask運行
 
 */
- (void)testSerialQueueAsync {
  dispatch_async(_serialQueue,^{
    [self fooA];
    dispatch_async(_serialQueue,^{
      [self fooB];
    });
     [self fooA];
  });
}

/**
 QUEUE_CONCURRENT(多線程) 異步
 正常運行
 
 1.ATask運行,同步加入BTask,Atask線程繼續運行不等待
 2.BTask加入到請求隊列中,有其他空余線程(ATask等線程在正常運行),BTask運行(ABTask同時運行)
 
 */
- (void)testConcurrentQueueAsync {
  dispatch_async(_concurrentQueue,^{
    [self fooA];
    // 同步 需要等待運行結果
    dispatch_async(_concurrentQueue,^{
      [self fooB];
    });
    
    // 等待同步代碼完成,再運行
    [self fooA];
  });
}

- (void)fooA {
  NSLog(@" ************ fooA ************ ");
}

- (void)fooB {
  NSLog(@" ************ fooB ************ ");
}

@end

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女