freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ios平臺下并發(fā)編程的研究和實現(xiàn)畢業(yè)論文-資料下載頁

2025-08-23 16:58本頁面

【導讀】多核CPU在移動終端上的普及,每個處理器上的核心只會增加。這種設備性能上的提。升使得其應用程序將會更加快捷流暢,程序更加高效以及產(chǎn)品更好的用戶體驗。個時刻仍然只執(zhí)行一個任務。由于多核時代的來臨,線程才開始擁有了真正意義上的并。多線程也作為越來越重要的一個部分需要開發(fā)者來掌握。然而受限于設備能耗。以及內(nèi)存大小等問題,移動應用開發(fā)中的多線程編程又區(qū)別于其他程序開發(fā)。者,需要擁抱變化,積極的適應技術的發(fā)展,并提升自己。

  

【正文】 myDataContext* theData = (MyDataContext *)context。 // 清空 myCleanUpDataContextFunction(theData)。 // 釋放 free(theData)。 } dispatch_queue_t createMyQueue() { MyDataContext* data = (MyDataContext *)malloc(sizeof(MyDataContext))。 myInitializeDataContextfuction(data)。 // 創(chuàng)建隊列并設置上下文指針 dispatch _queue_t serialQueue = dispatch_queue_create(,NULL)。 武漢工程大學 畢業(yè)論文 20 if (serialQueue) { dispatch_set_context(serialQueue, data)。 dispatch_set_finalizer_f (serialQueue, amp。myFinalizerFunction)。 } return serialQueue。 } 添加任務到隊列中 為了執(zhí)行任務,必須將其添加到調度隊列中,可以使用同步或異步的方式,也可以單個或成組的調度。一旦進入隊列,考慮到其約束和現(xiàn)有的任務已經(jīng)在隊列中,就盡可能最快 地 開始執(zhí)行任務。本章節(jié)展示一些調度任務的 技術,并介紹了各自的優(yōu)點。 添加單個任務到隊列中 有兩種方式將一個任務添加到隊列中,同步的或異步的。如果可能的話,使用dispatch_async 和 dispatch_async_f 函數(shù)的異步方案要優(yōu)于同步的代碼, 在 向隊列中添加任務后,還沒有辦法知道具體開始執(zhí)行的時間。因此,使用異步的方式,能夠 可以 在添加完之后繼續(xù)做其他事情,這一點在主線程中使用時很重要 [7]。 盡管應該盡可能添加異步的任務,但是有的時候,需要添加同步任務以避免競爭條件或其他一些同步的錯誤,在這些情況下,可以使用 dispatch_sync 和 dispatch_sync_f函數(shù)。這些函數(shù)阻塞當前線程的執(zhí)行,直到任務完成。 永遠不應該調用同步任務到你需要執(zhí)行任務的線程,因為這樣可能會造成死鎖。在串行隊列中會造成死鎖,在并發(fā)線程中也應該避免這樣做。 下面的例子演示了如何同步或異步執(zhí)行基于 block 的變體: dispatch_queue_t myCustomQueue。 myCustomQueue = dispatch_queue_create(, NULL)。 dispatch_async(myCustomQueue, ^{ printf(Do some work here.\n)。 })。 printf(The first block may or may not have run.\n)。 dispatch_sync(myCustomQueue, ^{ printf(Do some more work here.\n)。 })。 printf(Both blocks have pleted.\n)。 當任務完成時執(zhí)行 pletion block 實際上,任務在隊列中獨立 地 執(zhí)行,然而當任務完成時,程序可能仍然想知道結果。在傳統(tǒng)的異步編程中,可能使用回調機制來處理,但在調度隊列中,可以使用 pletion block[8]。 pletion block 僅僅只是在調度任務時添加在尾部的代碼塊。調用的代碼通常會提武漢工程大學 畢業(yè)論文 21 供 pletion block 作為一個參數(shù),所有任務完成后的代碼作為 pletion block 提交給隊列。 下面展示了一種 常見 的用法: void average_async(int *data, size_t len, dispatch_queue_t queue, void (^block)(int)) { // Retain 隊列 以保證當 pletion block被取消時隊列仍然在內(nèi)存中 dispatch_retain(queue)。 // 在默認的并發(fā)隊列中 執(zhí)行 任務并且在任務完成后執(zhí)行用戶提供的 pletion block dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^ { int avg = average(data, len)。 dispatch_async(queue, ^{ block(avg)。})。 // 當用戶提供的 block完成時 release 隊列 dispatch_release(queue)。 })。 } 并 行執(zhí)行循環(huán)迭代 另一種并發(fā)隊列特別有用的地方是循環(huán)迭代計算,例如,可能使用 for 循環(huán)做一些計算。 如果每次迭代的工作與其他迭代是獨立的,而且每次循環(huán)執(zhí)行的順序不重要,那么可以使用 dispatch_apply或 dispatch_apply_f 函數(shù)來替換循環(huán),這樣可能會同時執(zhí)行多個循環(huán)迭代。 雖然在調用函數(shù)時可以使用串行隊列,但是這 種 做法完全沒有必要, 因為 沒有什么性能上的優(yōu)勢 [9]。 像普通的 for 循環(huán), dispatch_apply 或 dispatch_apply_f 函數(shù)在所有的循環(huán)迭代完成之前不會返回。因此,你應當在隊列的上下文中執(zhí)行時小心一些,如果傳遞的參數(shù)是串行隊列,那么有可能造成死鎖。如果當前的任務比較耗時,最好在另一個線程中調用它。 例如下面這個用 dispatch_apply替換 for 循環(huán) 的例子: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)。 dispatch_apply(count, queue, ^(size_t i) { printf(%u\n,i)。 })。 應該確保給每次循環(huán)迭代安排合適的工作量,因為有塊添加到隊列的開銷以及調度執(zhí)行代碼的開銷。如果每次循環(huán)迭代的任務量很小,那么這些開銷會讓 替代 循環(huán)變 得 得不償失。 在主線程上執(zhí)行任務 GCD 提供了一個特殊的調度隊列,能夠在主線程上執(zhí)行任務,這個隊列自動給程武漢工程大學 畢業(yè)論文 22 序設置一個 RunLoop,并對主線程自動 drain。如果不想創(chuàng)建 Cocoa 程序,而且不想顯示 地 設置 RunLoop,那么必須調用 dispatch_main 方法 drain主線程,當然也可以添加任務到這個隊列,但是它不會執(zhí)行,直到調用這個方法。 可以通過調用 dispatch_get_main_queue 函數(shù),獲取依附主線程的調度隊列,因 而 可以作為應用程序的一個同步點。 在任務中使用 ObjectiveC 對象 GCD 對 Cocoa 內(nèi)存管理 提供了內(nèi)建的支持,因此可以在提交到隊列的 block中輕松的使用 ObjectiveC 對象。每一個調度隊列維護自己的自動引用池來確保自動釋放的對象會在某個點釋放,隊列不能保證他們實際 release 了這些對象。 如果程序可用的內(nèi)存吃緊或 block 創(chuàng)建了很多自動釋放的對象,創(chuàng)建自己的自動引用池是唯一的辦法來確保對象適時的 release。如果 block創(chuàng)建了很多的對象,可能需要相應的自動引用池 [10]。 掛起和恢復調度隊列 可以通過掛起隊列來暫停 block的執(zhí)行,使用 dispatch_suspend 函數(shù)掛起隊 列,并增加隊列暫停引用計數(shù);使用 dispatch_resume 函數(shù)繼續(xù)隊列的執(zhí)行,并減少其引用計數(shù)。引用計數(shù)大于 0 時,會掛起。因 此 必須保持平衡,使所有的暫停操作都有匹配的恢復操作。 暫停和恢復調用是異步的,并且只影響還未執(zhí)行的 block,正在執(zhí)行的 block不會被打斷。 使用 dispatch 信號量控制可用的有限資源 如果提交到隊列中的任務需要訪問一些有限的資源,可能需要使用 dispatch信號量來控制同時訪問資源的任務數(shù)量。 dispatch 信號量與傳統(tǒng)信號量類似但是有一點不同,當資源可獲取時, dispatch信號量的獲取相比傳統(tǒng)信號量只需要很少的時間。因為 GCD在這種特殊情況下并不會調用內(nèi)核。只有極少數(shù)資源無法獲取時,才會調用內(nèi)核,因為系統(tǒng)需要暫停線程直到該信號量狀態(tài)消失。 使用調度信號量的語 法 如下: 1. 當創(chuàng)建調度信號量時(使用 dispatch_semaphore_create 函數(shù)),可以指定一個絕對值來表示當前可使用的資源數(shù)量。 2. 在每一個任務中,調用 dispatch_semaphore_wait 等待信號量。 3. 當?shù)却{用返回時,使用資源繼續(xù)工作。 4. 當完成與資源有關工作后,釋放對資源的引用并且標識信號量,通 過dispathch_semaphore_signal 函數(shù)。 武漢工程大學 畢業(yè)論文 23 為了描述這些步驟,舉一個使用文件描述符的例子。每個程序都給定了有限的文件描述符可以使用,如果某個任務需要處理大量的文件,那么肯定不想同一時間打開大量的文件使得文件描述符超出了限制??墒褂眯盘柫縼硖幚磉@種問題,下面是一些基本的代碼: // 創(chuàng)建信號量,初始化可用的文件描述符數(shù)量 dispatch_semaphore_t fd_sema = dispatch_semaphore_create(getdtablesize() / 2)。 // 等待可 用的文件描述符 dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER)。 fd = open(/etc/services, O_RDONLY)。 // 完成工作后,釋放資源,并且標識信號量 close(fd)。 dispatch_semaphore_signal(fd_sema)。 等待一組任務的完成 dispatch groups 是一種可以鎖住一個線程直到其他任務完成執(zhí)行的方式,如果當前任務需要其他一個或多個任務完成時才可以執(zhí)行,這種情況下 可以使用 dispatch groups。另一種使用方式是作為線程同步的替代方案,如果打算使用多個子線程并且同步執(zhí)行它們,那么可以將它們對應的任務添加到 dispatch group 中并等待整個 group 完成 [11]。 下面是一個基本的例子, dispatch_group_async 函數(shù)將任務與組關聯(lián)起來,所有執(zhí)行完成后出隊,使用 dispatch_group_wait 函數(shù)等待一組任務的完成。 // 創(chuàng)建全局隊列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)。 // 創(chuàng)建一個組 dispatch_group_t group = dispatch_group_create()。 // 添加任務進組 dispatch_group_async(group, queue, ^{ // 處理一些異步的任務 })。 // 做一些其他的工作 // 當需要等待組中的任務完成后才能繼續(xù)工作時 dispatch_group_wait(group, DISPATCH_TIME_FOREVER)。 // 完成 工作后釋放這個組 dispatch_release(group)。 調度隊列和 線程安全 在調度隊列中討論線程安全的問題似乎看起來很奇怪,但是線程安全仍然是一個有意思的話題,當在程序中使用并發(fā)時,下面 總結 了一些常用的知識點: 1. 調度隊列本身是線程安全的,換句話說,系統(tǒng)沒有采取鎖或者同步這個隊列時,可以在任何線程中向 dispatch queue 提交任務 [12]。 2. 不要在 dispatch_async 中傳入當前隊列,并且調用 這個 任務,這會阻塞當前線程,武漢工程大學 畢業(yè)論文 24 即不要在當前線程中執(zhí)行同步操作。 避免在提交隊列的任務中使用 鎖,盡管這種行為是安全的,但是性能上會 有 很大影響,如果有需要用到鎖的地方,可以使用串行隊列來替代。 武漢工程大學 畢業(yè)論文 25 第五章 調度 源 每當與系統(tǒng)底層進行交互時,必須要做好這種任務 的 執(zhí)行可能會消耗大量時間的準備。調用內(nèi)核或者其他系統(tǒng)層次涉及到的改變相比 應用程序本身 的進程相是相當耗時的。因為這些原因,許多系統(tǒng)的庫都提供了異步的 API,允許代碼向系統(tǒng)提交請求后繼續(xù)做別的工作,這時請求仍在進行中。 GCD 就是依據(jù)這種方式,允許提交請求,并且使用 block和調度隊列來回調請求的結果。 Source介紹 Dispatch Source 是協(xié)調底層特殊系統(tǒng)事件的基本類型。 GCD 支持以下 Dispatch Sources: 1
點擊復制文檔內(nèi)容
黨政相關相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1