GCD的一些測試

對GCD的封裝

如何實現指定線程數目的線程池?

使用信號量

dispatch_queue_t workConcurrentQueue = dispatch_queue_create("cccccccc", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t serialQueue = dispatch_queue_create("sssssssss",DISPATCH_QUEUE_SERIAL);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
for (NSInteger i = 0; i < 10; i++) {
dispatch_async(serialQueue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_async(workConcurrentQueue, ^{
    NSLog(@"thread-info:%@開始執行任務%d",[NSThread currentThread],(int)i);
    sleep(1);
    NSLog(@"thread-info:%@結束執行任務%d",[NSThread currentThread],(int)i);
    dispatch_semaphore_signal(semaphore);});
});
}
NSLog(@"主線程...!");

這樣子創建的的線程最多也就是三個。因爲信號量初始化的時候寫的是3

串行隊列的同步異步測試

如下異步給串行隊列裏面放任務


dispatch_queue_t serialQueue = dispatch_queue_create("sssssssss",DISPATCH_QUEUE_SERIAL);
dispatch_async(serialQueue, ^{ printf("PRINT>>>>1\n"); });
    printf("PRINT>>>>2\n");
    dispatch_async(serialQueue, ^{ printf("PRINT>>>>3\n"); });
    printf("PRINT>>>>4\n");
    

打印結果

第一次運行:

PRINT>>>>2
PRINT>>>>1
PRINT>>>>4
PRINT>>>>3

第二次運行

PRINT>>>>2
PRINT>>>>4
PRINT>>>>1
PRINT>>>>3

換成同步調用串行隊列如下代碼

dispatch_sync(serialQueue, ^{ printf("PRINT>>>>1\n"); });
    printf("PRINT>>>>2\n");
    dispatch_sync(serialQueue, ^{ printf("PRINT>>>>3\n"); });
    printf("PRINT>>>>4\n");

兩次調用結果都是

PRINT>>>>1
PRINT>>>>2
PRINT>>>>3
PRINT>>>>4

所以得出結論,對於串行隊列,同步和異步的區別在於,同步會等待這次任務執行完成,異步只會把任務放進隊列裏,這裏任務值得是「block

但是無論是同步還是異步,串行隊列的任務執行順序是固定的,按照放進隊列的先後順序執行的

並行隊列的同步異步測試

dispatch_queue_t serialQueue = dispatch_queue_create("sssssssss",DISPATCH_QUEUE_CONCURRENT);

dispatch_sync(serialQueue, ^{ printf("PRINT>>>>1\n"); });

printf("PRINT>>>>2\n");
    
dispatch_sync(serialQueue, ^{ printf("PRINT>>>>3\n"); });

printf("PRINT>>>>4\n");
    

這裏同步調用並行隊列,結果總是

PRINT>>>>1
PRINT>>>>2
PRINT>>>>3
PRINT>>>>4

所以同步調用並行隊列,和同步調用串行隊列的結果一致,任務總是一個接一個的執行,要等待上一個任務完成纔會執行下一個任務

異步調用並行隊列

dispatch_queue_t serialQueue = dispatch_queue_create("sssssssss",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(serialQueue, ^{ printf("PRINT>>>>1\n"); });

printf("PRINT>>>>2\n");

dispatch_async(serialQueue, ^{ printf("PRINT>>>>3\n"); });

printf("PRINT>>>>4\n");
    

每次運行的結果都不一樣。順序沒有辦法確定。就是所謂異步。

dispatch_barrier_測試

dispatch_async(serialQueue, ^{ printf("PRINT>>>>1\n"); });
    printf("PRINT>>>>2\n");
    
    
  dispatch_barrier_sync(serialQueue, ^{
        NSLog(@"barrier\n");
    });
    
    
    dispatch_async(serialQueue, ^{ printf("PRINT>>>>3\n"); });
    printf("PRINT>>>>4\n");
    

此處 serialQueue 是一個並行隊列,方便測試,直接改創建的函數了。

運行結果如下:

PRINT>>>>2
PRINT>>>>1
barrier
PRINT>>>>4
PRINT>>>>3

這裏因爲調用的是 dispatch_barrier_sync 同步執行的,所以 3 4 總在 barrier 後面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章