1. 程式人生 > >iOS控制高併發-dispatch_semaphore(訊號量)的用法

iOS控制高併發-dispatch_semaphore(訊號量)的用法

1.前言:

     在單執行緒的程式中,程式的執行有先後順序,但是在多執行緒的程式中,線上程之間的程式執行中沒有先後順序,因此會出現併發的情況,導致程式的不確定性,因此需要dispatch_semaphore做程式的高併發管理。

2.介紹:

    dispatch_semaphore可以看作已整形作為計數方式進行控制的方式,dispatch_semaphore的基本單位是整形,在GCD中有三個函式可以進行控制:

 dispatch_semaphore_create(a)   建立一個初始值為a的semaphore
 dispatch_semaphore_wait        使訊號總量-1,並且當a的訊號量為大於0的時候,gcd執行緒繼續執行,當a的訊號量的值小於0時,gcd執行緒建立阻塞,其餘執行緒繼續執行。

    dispatch_semaphore_signal       傳送一個訊號,使訊號量+1,

3.舉例:

	//建立一個總數為0的訊號量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self setObject:object forKey:key block:^(TMCache *cache, NSString *key, id object) {
    //執行緒結束之後傳送訊號量
        dispatch_semaphore_signal(semaphore);
    }];
    //訊號量-1,方法等待,保持始終只有一個[self setObject:object forKey:key block]方法執行

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);