使用信號量(dispatch_semaphor)實現GCD下的併發和同步。

信號量是一個整形值而且具備一個初始計數值,而且支持兩個操做:信號通知和等待。當一個信號量被信號通知,其計數會被增長。當一個線程在一個信號量上等待時,線程會被阻塞(若是有必要的話),直至計數器大於零,而後線程會減小這個計數。
  在GCD中有三個函數是semaphore的操做,分別是:
  dispatch_semaphore_create   建立一個semaphore
  dispatch_semaphore_signal   發送一個信號
  dispatch_semaphore_wait    等待信號
  簡單的介紹一下這三個函數,第一個函數有一個整形的參數,咱們能夠理解爲信號的總量,dispatch_semaphore_signal是發送一個信號,天然會讓信號總量加1,dispatch_semaphore_wait等待信號,當信號總量少於0的時候就會一直等待,不然就能夠正常的執行,並讓信號總量-1。併發

根據這樣的原理,咱們能夠快速的建立一個併發控制來同步任務和有限資源訪問控制。async

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);

  簡單的介紹一下這一段代碼,建立了一個初使值爲10的semaphore,每一次for循環都會建立一個新的線程,線程結束的時候會發送一個信號,線程建立以前會信號等待,因此當同時建立了10個線程以後,for循環就會阻塞,等待有線程結束以後會增長一個信號才繼續執行,如此就造成了對併發的控制,如上就是一個併發數爲10的一個線程隊列。函數

另外,咱們也能夠使用信號量 實現GCD下的同步。spa

dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(0);
dispatch_semaphore_t semaphore2 = dispatch_semaphore_create(0);

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"thread 2");
        sleep(2);
        dispatch_semaphore_signal(semaphore2);
    });
    dispatch_semaphore_wait(semaphore2, DISPATCH_TIME_FOREVER);
    NSLog(@"thread 1");
    sleep(2);
    dispatch_semaphore_signal(semaphore1);
});
dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);
NSLog(@"main thread");

打印結果
2015-06-24 16:51:08.132 Test[8670:2238841] thread 2
2015-06-24 16:51:10.138 Test[8670:2238814] thread 1
2015-06-24 16:51:12.141 Test[8670:2238757] main thread線程

相關文章
相關標籤/搜索