1. 程式人生 > >iOS多執行緒的初步研究(十)-- dispatch同步

iOS多執行緒的初步研究(十)-- dispatch同步

一、dispatch組(dispatch group

1. 建立dispatch組

dispatch_group_t group = dispatch_group_create(); 

2. 啟動dispatch佇列中的block關聯到group中

dispatch_group_async(group, queue, ^{ 

  // 。。。 

}); 

3. 等待group關聯的block執行完畢,也可以設定超時引數

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 

4. 為group設定通知一個block,當group關聯的block執行完畢後,就呼叫這個block。類似dispatch_barrier_async。

dispatch_group_notify(group, queue, ^{

  // 。。。 

}); 

5. 手動管理group關聯的block的執行狀態(或計數),進入和退出group次數必須匹配

dispatch_group_enter(group);

dispatch_group_leave(group);

所以下面的兩種呼叫其實是等價的, 

A)

dispatch_group_async(group, queue, ^{ 

  // 。。。 

}); 

B) 

dispatch_group_enter(group);

dispatch_async(queue, ^{

  //。。。

  dispatch_group_leave(group);

});

二、dispatch訊號量(dispatch semaphore

1. 建立訊號量,可以設定訊號量的資源數。0表示沒有資源,呼叫dispatch_semaphore_wait會立即等待。

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

2. 等待訊號,可以設定超時引數。該函式返回0表示得到通知,非0表示超時。

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

3. 通知訊號,如果等待執行緒被喚醒則返回非0,否則返回0。

dispatch_semaphore_signal(semaphore);

最後,還是回到生成消費者的例子,使用dispatch訊號量是如何實現同步:

dispatch_semaphore_t sem = dispatch_semaphore_create(0);

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT0), ^{ //消費者佇列

      while (condition) {

    if (dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW10*NSEC_PER_SEC))) //等待10秒

      continue;

    //得到資料

  }

});

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT0), ^{ //生產者佇列

      while (condition) {

     if (!dispatch_semaphore_signal(sem))

    {

      sleep(1); //wait for a while

      continue;

    }

    //通知成功

  }

});

相關推薦

iOS執行初步研究-- dispatch同步

一、dispatch組(dispatch group) 1. 建立dispatch組 dispatch_group_t group = dispatch_group_create();  2. 啟動dispatch佇列中的block關聯到group中 dispatch_group_async(group,

iOS 執行初步研究-NSThread

對於多執行緒的開發,iOS系統提供了多種不同的介面,先談談iOS多執行緒最基礎方面的使用。產生執行緒的方式姑且分兩類,一類是顯式呼叫,另一類是隱式呼叫。 一、顯示呼叫的類為NSThread。一般構造NSThread的執行緒物件可通過兩種方式: 1. 初始化執行緒主方法: [NSThread deta

iOS執行初步研究-- dispatch佇列

GCD程式設計的核心就是dispatch佇列,dispatch block的執行最終都會放進某個佇列中去進行,它類似NSOperationQueue但更復雜也更強大,並且可以巢狀使用。所以說,結合block實現的GCD,把函式閉包(Closure)的特性發揮得淋漓盡致。 dispatch佇列的生成可以有這

iOS執行初步研究dispatch

dispatch源(dispatch source)和RunLoop源概念上有些類似的地方,而且使用起來更簡單。要很好地理解dispatch源,其實把它看成一種特別的生產消費模式。 dispatch源

java執行快速入門

在方法上面加synchonizd用的是this鎖 package com.cppdy; class MyThread7 implements Runnable { private Integer ticketCount = 100; public boolean falg = tr

java執行快速入門

在靜態方法上面加synchonizd用的是位元組碼檔案鎖 package com.cppdy; class MyThread8 implements Runnable { private static Integer ticketCount = 100; public boolea

java執行快速入門

ThreadLocal關鍵字實現每個執行緒有自己的變數 package com.cppdy; class Number { private int num; public static ThreadLocal<Integer> threadLocal = new Th

java執行快速入門

Lock鎖是JDK1.5之後推出的併發包裡面的關鍵字(注意捕獲異常,釋放鎖) Lock與synchronized的區別   Lock鎖可以人為的釋放鎖(相當於汽車中的手動擋)   synchronized當執行緒執行完畢或者丟擲異常的話,鎖自動釋放(相當於汽車中的自動擋) Condition用法  

ios執行初步,主執行重新整理UI

去研究一下iOS多執行緒的起因是自己程式裡用了一個等待指示器UIActivityIndicatorView,俗稱小菊花。但是在給頂層ViewController用addsubview加入這個控制元件並使轉動時,螢幕並沒有出現菊花。經過好一番除錯都沒找到原因。去網

Java 執行學習筆記 單例設計模式延遲載入/懶漢模式DCL解決執行安全問題

package extthread; import test.MyObject; public class MyThread extends Thread { @Override publi

iOS 執行使用總結很實用

每次準備開始新的航行,總是要複習一遍演算法啊,多執行緒啊,記憶體管理啊之類的理論和應用知識,這次把他們整理成文件,方便以後的學習和不斷的積累進步。         多執行緒給我留下的是痛苦的記憶,當時在上家創業公司的最後階段,就是被Feature Phone上面的多執行緒方案導致bug叢生,搞的焦頭爛額。  

執行詳解

多執行緒詳解(二) 在正式介紹執行緒建立的第二種方法之前,我們接著多執行緒詳解(一),講一下:對執行緒的記憶體圖、執行緒的狀態,為下面的學習打下基礎,小夥伴們不要急喲!! 一、多執行緒執行的記憶體圖(ps.博主沒有找到合適的畫圖工具,歡迎大神們貢獻啊) class pers

執行詳解

[多執行緒詳解(一)](http://www.neilx.com) 一、概念準備 1、程序 (1)直譯:正在進行中的程式 (2)解釋:執行一個程式時,會在記憶體中為程式開闢空間,這個空間就是一個程序。 (3)注意:一個程序中不可能沒有執行緒,只有有了執行緒才能執行; 程序只

Linux程式設計 程序,執行求解PI圓周率

題目: 連結 多程序: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #define n 100000000.0 int main() { i

執行學習總結

一、多執行緒帶來的問題 (一)活躍性問題 死鎖:兩個執行緒相互等待對方釋放資源 飢餓: 多執行緒併發時優先順序低的執行緒永遠得不到執行;執行緒被永久阻塞在一個等待進入同步塊的狀態;等待的執行緒永遠不被喚醒 活鎖:活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致

執行學習總結

一、程序和執行緒的定義 程序:程序是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項。程式執行時系統就會建立一個程序,併為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配CPU時間,程式開始真正執行。 執行緒:執行緒是程式執行時的最小單位,它是程序

java:執行的基礎引入

* 1.什麼是執行緒     * 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒     * 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作* 2.多執行緒的應用場景     * 紅

java執行快速入門

通過匿名內部類的方法建立多執行緒 package com.cppdy; //通過匿名內部類的方法建立多執行緒 public class ThreadDemo2 { public static void main(String[] args) { new Thread(ne

java執行快速入門

多執行緒應用例項(批量傳送簡訊) 1、建立實體類 package com.cppdy; public class UserEntity { private int id; private String name; public int g

java執行快速入門

什麼是守護執行緒   守護執行緒是為使用者執行緒服務的這麼一個執行緒,主執行緒結束,守護執行緒也結束 package com.cppdy; class MyThread3 extends Thread{ @Override public void run() {