溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

IOS開(kāi)發(fā)-多線程隊(duì)列測(cè)試代碼

發(fā)布時(shí)間:2020-08-25 09:38:30 來(lái)源:腳本之家 閱讀:120 作者:chenhh6701 欄目:移動(dòng)開(kāi)發(fā)

直接貼測(cè)試代碼了。

當(dāng)前考慮的問(wèn)題:
1.隊(duì)列有多少個(gè)消費(fèi)者
2.添加到隊(duì)列的新task是同步運(yùn)行(當(dāng)前線程阻塞)還是異步(當(dāng)前線程不阻塞)
3.多個(gè)隊(duì)列之間的調(diào)度(此文章未涉及)

//
// 單線程和多線程并發(fā)隊(duì)列測(cè)試(同步和異步)
//
// 基礎(chǔ)原理:
// 1)隊(duì)列:
//  1.1 dispatch_queue_t 是一個(gè)隊(duì)列,一個(gè)FIFO的消費(fèi)隊(duì)列
//  1.2 消費(fèi)者:隊(duì)列配置的運(yùn)行線程
//  1.3 被消費(fèi)對(duì)象: 添加到隊(duì)列中的運(yùn)行任務(wù)(block等)
//  1.4 運(yùn)行任務(wù):將任務(wù)放到隊(duì)列中,等待消費(fèi)者消費(fèi)
// 2)同步,異步  (對(duì)于任務(wù)) (此處的運(yùn)行指將任務(wù)發(fā)入到請(qǐng)求隊(duì)列中)
//  2.1 同步:A任務(wù)在運(yùn)行時(shí),插入B任務(wù),A任務(wù)等待B任務(wù)運(yùn)行完才能運(yùn)行
//  2.2 異步: A任務(wù)在運(yùn)行時(shí),插入B任務(wù),A任務(wù)不等待并且繼續(xù)運(yùn)行,B任務(wù)也運(yùn)行
// 假設(shè):
// ATask: 運(yùn)行fooA的Block
// BTask: 運(yùn)行fooB的Block
//
//
// 總結(jié):
// 不管單線程或多線程,同步或異步,一定要聯(lián)系請(qǐng)求隊(duì)列考慮



#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運(yùn)行,同步加入BTask
 2.BTask加入到請(qǐng)求隊(duì)列中,可是沒(méi)有其他空余線程(ATask線程在 等待BTask),BTask等待空余線程,
 3.死鎖發(fā)生
 
 */
- (void)testSerialQueueSync {
  dispatch_sync(_serialQueue,^{
    [self fooA];
    dispatch_sync(_serialQueue,^{
       [self fooB];
    });
    [self fooA];
  });
}

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

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

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

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

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

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

@end

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI