如何實現指定線程數目的線程池?
使用信號量
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 後面。