dispatch_semaphore

 

GDC dispatch_semaphore 

 分類:
 
 
 當咱們在處理一系列線程的時候,當數量達到必定量,在之前咱們可能會選擇使用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,根據這樣的原理,咱們即可以快速的建立一個併發控制來同步任務和有限資源訪問控制多線程

 

 

 

  int data = 3;併發

    __block int mainData = 0;async

    __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);函數

    

    dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);post

    

    dispatch_async(queue, ^(void) {ui

        int sum = 0;spa

        for(int i = 0; i < 5; i++).net

        {線程

            sum += data;

            

            NSLog(@" >> Sum: %d", sum);

        }

        

        dispatch_semaphore_signal(sem);

    });

    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

    for(int j=0;j<5;j++)

    {

        mainData++;

        NSLog(@">> Main Data: %d",mainData);

    }

    

    

    

    

    dispatch_release(sem);

    dispatch_release(queue);

 
 
輸出:

2013-07-08 11:33:05.654 dispatch[1102:1e03]  >> Sum: 3

2013-07-08 11:33:05.656 dispatch[1102:1e03]  >> Sum: 6

2013-07-08 11:33:05.657 dispatch[1102:1e03]  >> Sum: 9

2013-07-08 11:33:05.658 dispatch[1102:1e03]  >> Sum: 12

2013-07-08 11:33:05.659 dispatch[1102:1e03]  >> Sum: 15

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 1

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 2

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 3

2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 4

2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 5

經過信號量就能夠保證,Main Data 永遠在Sum以後執行
相關文章
相關標籤/搜索