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_DEFAULT, 0), ^{ //消費者佇列
while (condition) {
if (dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, 10*NSEC_PER_SEC))) //等待10秒
continue;
//得到資料
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //生產者佇列
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() {