GCD dispatch_semaphore
?????? 當我們在處理一系列線程的時候,當數量達到一定量,在以前我們可能會選擇使用NSOperationQueue來處理并發控制,但如何在GCD中快速的控制并發呢?答案就是dispatch_semaphore.
信號量是一個整形值并且具有一個初始計數值,并且支持兩個操作:信號通知和等待。當一個信號量被信號通知,其計數會被增加。當一個線程在一個信號量上等待時,線程會被阻塞(如果有必要的話),直至計數器大于零,然后線程會減少這個計數。在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;
? ? __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
?? ?
? ? dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
?? ?
? ? dispatch_async(queue, ^(void) {
? ? ? ? int sum = 0;
? ? ? ? for(int i = 0; i < 5; i++)
? ? ? ? {
? ? ? ? ? ? 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之后執行
總結
以上是生活随笔為你收集整理的GCD dispatch_semaphore的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取手机信息(UIDevice、NSBu
- 下一篇: Linux常用命令rlogin怎么用