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

正文內(nèi)容

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

2025-07-27 08:25本頁面
  

【正文】 平衡,使所有的暫停操作都有匹配的恢復(fù)操作。暫停和恢復(fù)調(diào)用是異步的,并且只影響還未執(zhí)行的block,正在執(zhí)行的block不會被打斷。如果提交到隊(duì)列中的任務(wù)需要訪問一些有限的資源,可能需要使用dispatch信號量來控制同時(shí)訪問資源的任務(wù)數(shù)量。dispatch信號量與傳統(tǒng)信號量類似但是有一點(diǎn)不同,當(dāng)資源可獲取時(shí),dispatch信號量的獲取相比傳統(tǒng)信號量只需要很少的時(shí)間。因?yàn)镚CD在這種特殊情況下并不會調(diào)用內(nèi)核。只有極少數(shù)資源無法獲取時(shí),才會調(diào)用內(nèi)核,因?yàn)橄到y(tǒng)需要暫停線程直到該信號量狀態(tài)消失。使用調(diào)度信號量的語法如下:1. 當(dāng)創(chuàng)建調(diào)度信號量時(shí)(使用dispatch_semaphore_create函數(shù)),可以指定一個(gè)絕對值來表示當(dāng)前可使用的資源數(shù)量。2. 在每一個(gè)任務(wù)中,調(diào)用dispatch_semaphore_wait等待信號量。3. 當(dāng)?shù)却{(diào)用返回時(shí),使用資源繼續(xù)工作。4. 當(dāng)完成與資源有關(guān)工作后,釋放對資源的引用并且標(biāo)識信號量,通過dispathch_semaphore_signal函數(shù)。為了描述這些步驟,舉一個(gè)使用文件描述符的例子。每個(gè)程序都給定了有限的文件描述符可以使用,如果某個(gè)任務(wù)需要處理大量的文件,那么肯定不想同一時(shí)間打開大量的文件使得文件描述符超出了限制??墒褂眯盘柫縼硖幚磉@種問題,下面是一些基本的代碼:// 創(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)。// 完成工作后,釋放資源,并且標(biāo)識信號量close(fd)。dispatch_semaphore_signal(fd_sema)。dispatch groups是一種可以鎖住一個(gè)線程直到其他任務(wù)完成執(zhí)行的方式,如果當(dāng)前任務(wù)需要其他一個(gè)或多個(gè)任務(wù)完成時(shí)才可以執(zhí)行,這種情況下可以使用dispatch groups。另一種使用方式是作為線程同步的替代方案,如果打算使用多個(gè)子線程并且同步執(zhí)行它們,那么可以將它們對應(yīng)的任務(wù)添加到dispatch group中并等待整個(gè)group完成[11]。下面是一個(gè)基本的例子,dispatch_group_async函數(shù)將任務(wù)與組關(guān)聯(lián)起來,所有執(zhí)行完成后出隊(duì),使用dispatch_group_wait函數(shù)等待一組任務(wù)的完成。// 創(chuàng)建全局隊(duì)列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)。// 創(chuàng)建一個(gè)組dispatch_group_t group = dispatch_group_create()。// 添加任務(wù)進(jìn)組dispatch_group_async(group, queue, ^{ // 處理一些異步的任務(wù)})。// 做一些其他的工作// 當(dāng)需要等待組中的任務(wù)完成后才能繼續(xù)工作時(shí)dispatch_group_wait(group, DISPATCH_TIME_FOREVER)。// 完成工作后釋放這個(gè)組dispatch_release(group)。在調(diào)度隊(duì)列中討論線程安全的問題似乎看起來很奇怪,但是線程安全仍然是一個(gè)有意思的話題,當(dāng)在程序中使用并發(fā)時(shí),下面總結(jié)了一些常用的知識點(diǎn):1. 調(diào)度隊(duì)列本身是線程安全的,換句話說,系統(tǒng)沒有采取鎖或者同步這個(gè)隊(duì)列時(shí),可以在任何線程中向dispatch queue提交任務(wù)[12]。2. 不要在dispatch_async中傳入當(dāng)前隊(duì)列,并且調(diào)用這個(gè)任務(wù),這會阻塞當(dāng)前線程,即不要在當(dāng)前線程中執(zhí)行同步操作。避免在提交隊(duì)列的任務(wù)中使用鎖,盡管這種行為是安全的,但是性能上會有很大影響,如果有需要用到鎖的地方,可以使用串行隊(duì)列來替代。第五章 調(diào)度源每當(dāng)與系統(tǒng)底層進(jìn)行交互時(shí),必須要做好這種任務(wù)的執(zhí)行可能會消耗大量時(shí)間的準(zhǔn)備。調(diào)用內(nèi)核或者其他系統(tǒng)層次涉及到的改變相比應(yīng)用程序本身的進(jìn)程相是相當(dāng)耗時(shí)的。因?yàn)檫@些原因,許多系統(tǒng)的庫都提供了異步的API,允許代碼向系統(tǒng)提交請求后繼續(xù)做別的工作,這時(shí)請求仍在進(jìn)行中。GCD就是依據(jù)這種方式,允許提交請求,并且使用block和調(diào)度隊(duì)列來回調(diào)請求的結(jié)果。 Source介紹Dispatch Source是協(xié)調(diào)底層特殊系統(tǒng)事件的基本類型。GCD支持以下Dispatch Sources:1. 定時(shí)器dispatch source :生成周期性的通知。2. 信號dispatch source:當(dāng) UNIX信號到達(dá)時(shí)通知。3. 描述符source:通知一些基于文件和套接字的操作,例如,當(dāng)數(shù)據(jù)能夠讀取時(shí)、可以寫入數(shù)據(jù)時(shí)、文件系統(tǒng)中文件被刪除移動或重命名時(shí)以及當(dāng)文件的元信息被修改時(shí)等[13]。4. 進(jìn)程dispatch source:通知一些有關(guān)進(jìn)程的事件,例如:進(jìn)程存在時(shí)、進(jìn)程發(fā)出 fork 或者 exec 類型的調(diào)用以及當(dāng)信號送達(dá)進(jìn)程時(shí)。5. Mach 端口dispatch source:通知有關(guān)端口的相關(guān)事件。6. 自定義dispatch source:自定義和自觸發(fā)的事件。Dispatch Sources用來取代通常用于系統(tǒng)相關(guān)事件監(jiān)控的異步回調(diào)函數(shù)。在配置一個(gè) 調(diào)度源時(shí),需要指定想要監(jiān)聽的事件、調(diào)度隊(duì)列以及用于處理事件的代碼??梢允褂胋lock或者函數(shù)來處理事件。當(dāng)監(jiān)聽的事件到達(dá)時(shí),調(diào)度源提交block或函數(shù)到指定的隊(duì)列中去執(zhí)行。跟手動提交任務(wù)到隊(duì)列相比,調(diào)度源為應(yīng)用程序提供了連續(xù)的事件源。調(diào)度源保持附加在其隊(duì)列上,除非你顯式地取消它。在附加后,當(dāng)相應(yīng)的事件發(fā)生時(shí),它將提交對應(yīng)的任務(wù)代碼塊到隊(duì)列上。比如一些定時(shí)器事件,這種事件周期性地發(fā)生,但大多數(shù)時(shí)間會發(fā)生在某些特定的狀態(tài)下。因此調(diào)度源會retain自己的隊(duì)列防止過早釋放,因?yàn)楹芸赡茚尫藕笙乱粋€(gè)事件發(fā)生后找不到隊(duì)列。為了防止隊(duì)列中事件太多發(fā)生積壓,調(diào)度源實(shí)現(xiàn)了一種合并機(jī)制。如果新的事件已經(jīng)到達(dá),而隊(duì)列中上一個(gè)事件尚未被處理,那么可以將這兩個(gè)事件的數(shù)據(jù)合并后作為一個(gè)新的事件。根據(jù)事件類型的不同,合并的結(jié)果可能是取代舊事件或者更新信息。例如在基于信號的調(diào)度源中,僅提供最近的信號信息,和距離上次處理之后總共交付了多少信號。 Source在創(chuàng)建調(diào)度源時(shí)除創(chuàng)建它本身以外還需要創(chuàng)建事件源,事件源就是處理事件需要的本地?cái)?shù)據(jù)結(jié)構(gòu)。舉個(gè)例子,在基于描述符的調(diào)度源中,需要用它打開描述符。基于進(jìn)程的源,需要獲取目標(biāo)程序的進(jìn)程ID。當(dāng)有了事件源后,可以按照下面的描述來創(chuàng)建對應(yīng)的調(diào)度源:1. 使用dispatch_source_create函數(shù)創(chuàng)建調(diào)度源。2. 配置調(diào)度源: a) 給它分配一個(gè)事件處理操作;b) 對于定時(shí)器源,使用dispatch_source_set_timer函數(shù)設(shè)置定時(shí)器信息。3. 有時(shí)還需要為其分配取消處理操作。4. 調(diào)用dispatch_resume函數(shù)來開始處理事件。由于調(diào)度源在使用前需要一些額外的配置,所以dispatch_source_create函數(shù)返回的是一個(gè)掛起的狀態(tài)。在掛起時(shí),它接收事件但是不做處理。這樣就有了時(shí)間來設(shè)置事件處理操作和其他額外的配置[14]。下面幾部分介紹了如何配置 dispatch source。在創(chuàng)建調(diào)度源時(shí),必須定義事件處理操作,用于處理調(diào)度源產(chǎn)生的事件。事件處理操作可以是一個(gè)函數(shù)或者block,然后可以用dispatch_source_set_event_handler或 dispatch_source_set_event_handler_f 函數(shù)進(jìn)行設(shè)置。當(dāng)事件發(fā)生后,將提交事件處理操作到指定的隊(duì)列上來處理事件。事件處理操作需要處理所有可能到達(dá)的事件,如果事件處理操作已經(jīng)在處理中,并且等待下一個(gè)事件。假如這時(shí)又來一個(gè)新的事件,調(diào)度源會將這兩個(gè)事件合并。事件處理操作通??雌饋硪恢碧幚碜钚碌牟僮?,其實(shí)很可能處理的是多個(gè)事件的合并版本。如果一個(gè)或多個(gè)新的事件到達(dá)時(shí),它已經(jīng)開始執(zhí)行了,那么調(diào)度源將保留這些事件并且再次向隊(duì)列請求?;诤瘮?shù)的事件處理操作采用單個(gè)上下文指針,包含調(diào)度源對象,并且不返回任何值?;赽lock的事件處理操作沒有參數(shù)也不返回值。// 基于block的事件處理操作void (^dispatch_block_t)(void)// 基于函數(shù)的時(shí)間處理操作void (*dispatch_function_t)(void *)在事件處理操作中,可以從調(diào)度源提供的事件中獲取事件的相應(yīng)信息。由于基于函數(shù)的事件處理程序已經(jīng)被傳遞了調(diào)度源的指針,所以基于block的事件處理程序需要自己捕獲這個(gè)指針。例如下面的程序段:// 創(chuàng)建調(diào)度源dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, myDescriptor, 0 ,myQueue)。// 設(shè)置調(diào)度源的事件處理操作dispatch_source_set_event_handler(source, ^{ // 通過捕獲的source對象獲取信息 size_t estimated = dispatch_source_get_data(source)。// 繼續(xù)相關(guān)操作})。在block中捕獲變量通常會更加動態(tài)靈活,當(dāng)然默認(rèn)捕獲的變量是只讀的。盡管block提供了可以修改變量的功能,但是最好不要去嘗試使用。調(diào)度源總是異步執(zhí)行其事件處理程序,所以可能之前捕獲的變量隨著事件處理程序的執(zhí)行已經(jīng)消失了。下面列出了可以在事件處理程序中獲取有關(guān)事件信息的函數(shù)[15]。dispatch_source_get_handle:這個(gè)函數(shù)返回調(diào)度源管理的底層數(shù)據(jù)類型。對于描述符源,返回int類型,包含其對應(yīng)的描述符;對于信號源,返回int類型,包含最近事件的信號數(shù)量;對于進(jìn)程源,返回pid_t類型的數(shù)據(jù)結(jié)構(gòu),對應(yīng)于被監(jiān)控的進(jìn)程;對于Mach端口源,返回mach_port_t數(shù)據(jù)結(jié)構(gòu);對于其他源,其返回值是不明確的。dispatch_source_get_data: 函數(shù)返回對應(yīng)事件產(chǎn)生的數(shù)據(jù);對于描述符源,如果是讀取數(shù)據(jù),返回可讀取的字節(jié)數(shù);如果是寫入數(shù)據(jù),返回可寫入的字節(jié)數(shù);如果是監(jiān)控文件系統(tǒng)的活動,返回一個(gè)常量指示事件發(fā)生的類型,其是一個(gè)dispatch_source_vnode_flags_t的枚舉類型;對于進(jìn)程源,返回dispatch_source_proc_flags_t枚舉類型,指示哪種進(jìn)程事件發(fā)生。對于Mach端口源,返回dispatch_source_machport_flags_t枚舉類型,指示事件類型; 對于自定義源,返回由dispatch_source_merge_data函數(shù)合并現(xiàn)值和新值后創(chuàng)建的合并值。dispatch_source_get_mask:函數(shù)返回事件標(biāo)識用于創(chuàng)建調(diào)度源。對于進(jìn)程,返回 dispatch source 收到事件的掩碼,參照dispatch_source_proc_flags_t枚舉類型;對于Mach端口,返回期望事件的掩碼,參照dispatch_source_mach_send_flags_t枚舉類型;對于自定義類型,返回用于合并數(shù)據(jù)的掩碼。取消處理操作在調(diào)度源釋放之前執(zhí)行清空工作。多數(shù)類型的調(diào)度源不需要取消處理操作,除非對調(diào)度源有自定義的行為并且需要在釋放時(shí)執(zhí)行。但使用描述符或Mach端口的調(diào)度源必須設(shè)置取消處理操作,用于關(guān)閉描述符或釋放端口。否則可能導(dǎo)致Bug,因?yàn)檫@些結(jié)構(gòu)體會被系統(tǒng)其他部分或應(yīng)用程序在不經(jīng)意間重用??梢栽谌魏螘r(shí)候加入取消處理操作,但通常在創(chuàng)建調(diào)度源時(shí)加入。使用dispatch_source_set_cancel_handler或dispatch_source_set_cancel_handler_f函數(shù)來設(shè)置取消處理操作。例如下面的例子: dispatch_source_set_cancel_handler(mySource,^{ close(fd)。 })。在創(chuàng)建調(diào)度源時(shí)可以指定一個(gè)隊(duì)列,用于執(zhí)行事件處理器和取消處理器。不過也可以使用dispatch_set_target_queue函數(shù)在任何時(shí)候修改目標(biāo)隊(duì)列。修改隊(duì)列可以改變執(zhí)行調(diào)度源事件的優(yōu)先級。修改調(diào)度源是異步操作,也就是說已經(jīng)執(zhí)行的事件不會對其造成影響。之后的事件會到修改后的隊(duì)列中執(zhí)行。和GCD的其他類型一樣,可以使用dispatch_set_context函數(shù)關(guān)聯(lián)自定義數(shù)據(jù)到調(diào)度源。使用context指針存儲處理器需要的數(shù)據(jù)。在存儲數(shù)據(jù)之后,就必須要加入取消處理器,因?yàn)樾枰谌∠僮髦嗅尫與ontext中的自定義數(shù)據(jù)。如果使用block實(shí)現(xiàn)事件處理器,那么可以捕獲本地變量在block中使用。雖然這樣可以代替context指針,但是應(yīng)該謹(jǐn)慎地使用這種方式。因?yàn)檎{(diào)度源可能長時(shí)間存在應(yīng)用程序的生命周期中,block捕獲指針變量時(shí)需要特別小心,因?yàn)橹羔樦赶虻臄?shù)據(jù)可能會被釋放,因此需要賦值這些數(shù)據(jù)或者retain指針。不管哪一種方式,都需要提供一個(gè)取消處理器來釋放這些已經(jīng)持有的數(shù)據(jù)[16]。調(diào)度源也是引用計(jì)數(shù)的數(shù)據(jù)類型,初始值為1,可以使用dispatch_retain和dispatch_release函數(shù)來增加和減少引用計(jì)數(shù)。當(dāng)引用計(jì)數(shù)為0時(shí),系統(tǒng)自動釋放調(diào)度源數(shù)據(jù)結(jié)構(gòu)。調(diào)度源的所有權(quán)可以由它本身在內(nèi)部或外部進(jìn)行管理。使用外部所有權(quán)時(shí),另一個(gè)對象擁有調(diào)度源,并負(fù)責(zé)在適當(dāng)?shù)臅r(shí)候釋放。雖然外部所有權(quán)的方式比較常見,但當(dāng)希望創(chuàng)建自主的調(diào)度源,并讓它管理自己的行為時(shí),可以使用內(nèi)部所有權(quán)。例如調(diào)度源應(yīng)用于單一全局事件時(shí),可以
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1