當咱們在處理一系列線程的時候,當數量達到必定量,在之前咱們可能會選擇使用NSOperationQueue來處理併發控制,但如何在GCD中快速的控制併發呢?答案就是dispatch_semaphore,對常常作unix開發的人來說,我所介紹的內容可能就顯得很是入門級了,信號量在他們的多線程開發中再日常不過了。
信號量是一個整形值而且具備一個初始計數值,而且支持兩個操做:信號通知和等待。當一個信號量被信號通知,其計數會被增長。當一個線程在一個信號量上等待時,線程會被阻塞(若是有必要的話),直至計數器大於零,而後線程會減小這個計數。
在GCD中有三個函數是semaphore的操做,分別是:
dispatch_semaphore_create 建立一個semaphore
dispatch_semaphore_signal 發送一個信號
dispatch_semaphore_wait 等待信號
簡單的介紹一下這三個函數,第一個函數有一個整形的參數,咱們能夠理解爲信號的總量,dispatch_semaphore_signal是發送一個信 號,天然會讓信號總量加1,dispatch_semaphore_wait等待信號,當信號總量少於0的時候就會一直等待,不然就能夠正常的執行,並讓 信號總量-1,根據這樣的原理,咱們即可以快速的建立一個併發控制來同步任務和有限資源訪問控制。html
dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i = 0; i < 100; i++)
{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_group_async(group, queue, ^{
NSLog(@"%i",i);
sleep(2);
dispatch_semaphore_signal(semaphore);
});
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(group);
dispatch_release(semaphore);ios
簡單的介紹一下這一段代碼,建立了一個初使值爲10的semaphore,每一次for循環都會建立一個新的線程,線程結束的時候會發送一個信號,線程 建立以前會信號等待,因此當同時建立了10個線程以後,for循環就會阻塞,等待有線程結束以後會增長一個信號才繼續執行,如此就造成了對併發的控制,如 上就是一個併發數爲10的一個線程隊列。多線程