GCD中的dispatch_sync、dispatch_sync 分別與串行、並行隊列組合執行小實驗


平常開發中會經常用gcd做一下多線程任務,但一直沒有對同步、異步任務在串行、並行隊列的執行情況做個全面的認識,今天寫了個demo跑了下,還是有些新發現的。

代碼如下:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

 

    [self gcdTest];

}

 

-(void)gcdTest

{

 

    dispatch_queue_t serialQueue= dispatch_queue_create("串行隊列", DISPATCH_QUEUE_SERIAL);

    dispatch_queue_t concurrentQueue=dispatch_queue_create("並行隊列", DISPATCH_QUEUE_CONCURRENT);

    

    dispatch_queue_t mainQueue=dispatch_get_main_queue();

    dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    

    //1:

//    for(int i=0;i<10;i++){

//        dispatch_sync(serialQueue, ^{

//            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//        });

//    }

    //結果,同步任務在串行隊列中,在主線程下串行執行

    

    //2:

//    for(int i=0;i<10;i++){

//        dispatch_sync(concurrentQueue, ^{

//            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//        });

//    }

    //結果,同步任務在並行隊列中,在主線程下串行執行

    

    //3:

//    for(int i=0;i<10;i++){

//        dispatch_sync(mainQueue, ^{

//            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//        });

//    }

    //結果,同步任務在主隊列中,鎖死

    

    //4:

//    for(int i=0;i<10;i++){

//        dispatch_sync(globalQueue, ^{

//            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//        });

//    }

    //結果,同步任務在全局隊列中,在主線程下串行執行

    

    //5:

//    for(int i=0;i<10;i++){

//        dispatch_async(serialQueue, ^{

//            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//        });

//    }

    //結果,異步任務在串行隊列中,在一個子線程中串行執行

    

    //6:

//    for(int i=0;i<10;i++){

//        dispatch_async(concurrentQueue, ^{

//            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//        });

//    }

    //結果,異步任務在並行隊列中,在多個子線程中並行執行

    

    //7:

//    for(int i=0;i<10;i++){

//        dispatch_async(mainQueue, ^{

//            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

//        });

//    }

    //結果,異步任務在主隊列中,在主線程中串行執行

    

    //8:

    for(int i=0;i<10;i++){

        dispatch_async(globalQueue, ^{

            NSLog(@"任務執行中....-%d\n mainThread:%@",i,[NSThread currentThread]);

        });

    }

    //結果,異步任務在全局隊列中,在多個子線程中並行執行

}

 

 

總結如下:

dispatch_sync:同步任務無論在自定義串行隊列、自定義並行隊列、主隊列(當前線程為主線程時會出現死鎖)、全局隊列 執行任務時,都不會創建子線程,而是在當前線程中串行執行;

dispatch_async:異步任務無論在自定義串行隊列、自定義並行隊列(主隊列除外,主隊列下,任務會在主線中串行執行)、全局隊列 執行任務時,都會創建子線程,並且在子線程中執行;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM