精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS多線程編程指南(一)關(guān)于多線程編程

移動(dòng)開發(fā) iOS
多線程是一個(gè)比較輕量級(jí)的方法來(lái)實(shí)現(xiàn)單個(gè)應(yīng)用程序內(nèi)多個(gè)代碼執(zhí)行路徑。在系統(tǒng)級(jí)別內(nèi),程序并排執(zhí)行,系統(tǒng)分配到每個(gè)程序的執(zhí)行時(shí)間是基于該程序的所需時(shí)間和其他程序的所需時(shí)間來(lái)決定的。然而在每個(gè)應(yīng)程序的內(nèi)部,存在一個(gè)或多個(gè)執(zhí)行線程,它同時(shí)或在一個(gè)幾乎同時(shí)發(fā)生的方式里執(zhí)行不同的任務(wù)。

多年來(lái),計(jì)算機(jī)的最大性能主要受限于它的中心微處理器的速度。然而由于個(gè)別處理器已經(jīng)開始達(dá)到它的瓶頸限制,芯片制造商開始轉(zhuǎn)向多核設(shè)計(jì),讓計(jì)算機(jī)具有了同時(shí)執(zhí)行多個(gè)任務(wù)的能力。盡管Mac OS X利用了這些核心優(yōu)勢(shì),在任何時(shí)候可以執(zhí)行系統(tǒng)相關(guān)的任務(wù),但自己的應(yīng)用程序也可以通過(guò)多線程方法利用這些優(yōu)勢(shì)。

1.什么是多線程

多線程是一個(gè)比較輕量級(jí)的方法來(lái)實(shí)現(xiàn)單個(gè)應(yīng)用程序內(nèi)多個(gè)代碼執(zhí)行路徑。在系統(tǒng)級(jí)別內(nèi),程序并排執(zhí)行,系統(tǒng)分配到每個(gè)程序的執(zhí)行時(shí)間是基于該程序的所需時(shí)間和其他程序的所需時(shí)間來(lái)決定的。然而在每個(gè)應(yīng)程序的內(nèi)部,存在一個(gè)或多個(gè)執(zhí)行線程,它同時(shí)或在一個(gè)幾乎同時(shí)發(fā)生的方式里執(zhí)行不同的任務(wù)。系統(tǒng)本身管理這些執(zhí)行的線程,調(diào)度它們?cè)诳捎玫膬?nèi)核上運(yùn)行,并在需要讓其他線程執(zhí)行的時(shí)候搶先打斷它們。

從技術(shù)角度來(lái)看,一個(gè)線程就是一個(gè)需要管理執(zhí)行代碼的內(nèi)核級(jí)和應(yīng)用級(jí)數(shù)據(jù)結(jié)構(gòu)組合。內(nèi)核級(jí)結(jié)構(gòu)協(xié)助調(diào)度線程事件,并搶占式調(diào)度一個(gè)線程到可用的內(nèi)核之上。應(yīng)用級(jí)結(jié)構(gòu)包括用于存儲(chǔ)函數(shù)調(diào)用的調(diào)用堆棧和應(yīng)用程序需要管理和操作線程屬性和狀態(tài)的結(jié)構(gòu)。

在非并發(fā)的應(yīng)用程序,只有一個(gè)執(zhí)行線程。該線程開始和結(jié)束于你應(yīng)用程序的main循環(huán),一個(gè)個(gè)方法和函數(shù)的分支構(gòu)成了你整個(gè)應(yīng)用程序的所有行為。與此相反,支持并發(fā)的應(yīng)用程序開始可以在需要額外的執(zhí)行路徑時(shí)候創(chuàng)建一個(gè)或多個(gè)線程。每個(gè)新的執(zhí)行路徑有它自己獨(dú)立于應(yīng)用程序main循環(huán)的定制開始循環(huán)。在應(yīng)用程序中存在多個(gè)線程提供了兩個(gè)非常重要的的潛在優(yōu)勢(shì):

  1. 多個(gè)線程可以提高應(yīng)用程序的感知響應(yīng)。
  2. 多個(gè)線程可以提高應(yīng)用程序在多核系統(tǒng)上的實(shí)時(shí)性能。

如果你的應(yīng)用程序只有單獨(dú)的線程,那么該獨(dú)立程序需要完成所有的事情。它必須對(duì)事件作出響應(yīng),更新您的應(yīng)用程序的窗口,并執(zhí)行所有實(shí)現(xiàn)你應(yīng)用程序行為需要的計(jì)算。擁有單獨(dú)線程的主要問(wèn)題是在同一時(shí)間里面它只能執(zhí)行一個(gè)任務(wù)。那么當(dāng)你的應(yīng)用程序需要很長(zhǎng)時(shí)間才能完成的時(shí)候會(huì)發(fā)生什么呢?當(dāng)你的代碼忙于計(jì)算你所需要的值的時(shí)候,你的程序就會(huì)停止響應(yīng)用戶事件和更新它的窗口。如果這樣的情況持續(xù)足夠長(zhǎng)的時(shí)間,用戶就會(huì)誤認(rèn)為你的程序被掛起了,并試圖強(qiáng)制退出。如果你把你的計(jì)算任務(wù)轉(zhuǎn)移到一個(gè)獨(dú)立的線程里面,那么你的應(yīng)用程序主線程就可以自由并及時(shí)響應(yīng)用戶的交互。

當(dāng)然多線程并不是解決程序性能問(wèn)題的靈丹妙藥。多線程帶來(lái)好處同時(shí)也伴隨著潛在問(wèn)題。應(yīng)用程序內(nèi)擁有多個(gè)可執(zhí)行路徑,會(huì)給你的代碼增加更多的復(fù)雜性。每個(gè)線程需要和其他線程協(xié)調(diào)其行為,以防止它破壞應(yīng)用程序的狀態(tài)信息。因?yàn)閼?yīng)用程序內(nèi)的多個(gè)線程共享內(nèi)存空間,它們?cè)L問(wèn)相同的數(shù)據(jù)結(jié)構(gòu)。如果兩個(gè)線程試圖同時(shí)處理相同的數(shù)據(jù)結(jié)構(gòu),一個(gè)線程有可能覆蓋另外線程的改動(dòng)導(dǎo)致破壞該數(shù)據(jù)結(jié)構(gòu)。即使有適當(dāng)?shù)谋Wo(hù),你仍然要注意由于編譯器的優(yōu)化導(dǎo)致給你代碼產(chǎn)生很微妙的(和不那么微妙)的Bug。

2.線程術(shù)語(yǔ)

在討論多線程和它支持的相關(guān)技術(shù)之前,我們有必要先了解一些基本的術(shù)語(yǔ)。如果你熟悉Carbon的多處理器服務(wù)API或者UNIX系統(tǒng)的話,你會(huì)發(fā)現(xiàn)本文檔里面“任務(wù)(task)”被用于不同的定義。在Mac OS的早期版本,術(shù)語(yǔ)“任務(wù)(task)”是用來(lái)區(qū)分使用多處理器服務(wù)創(chuàng)建的線程和使用Carbon線程管理API創(chuàng)建的線程。在UNIX系統(tǒng)里面,術(shù)語(yǔ)“任務(wù)(task)”也在一段時(shí)間內(nèi)被用于指代運(yùn)行的進(jìn)程。在實(shí)際應(yīng)用中,多處理器服務(wù)任務(wù)是相當(dāng)于搶占式的線程。

由于Carbon線程管理器和多處理器服務(wù)API是Mac OS X的傳統(tǒng)技術(shù),本文件采用下列術(shù)語(yǔ):

  1. 線程(線程)用于指代獨(dú)立執(zhí)行的代碼段。
  2. 進(jìn)程(process)用于指代一個(gè)正在運(yùn)行的可執(zhí)行程序,它可以包含多個(gè)線程。
  3. 任務(wù)(task)用于指代抽象的概念,表示需要執(zhí)行工作。

3.多線程的替代方法

你自己創(chuàng)建多線程代碼的一個(gè)問(wèn)題就是它會(huì)給你的代碼帶來(lái)不確定性。多線程是一個(gè)相對(duì)較低的水平和復(fù)雜的方式來(lái)支持你的應(yīng)用程序并發(fā)。如果你不完全理解你的設(shè)計(jì)選擇的影響,你可能很容易遇到同步或定時(shí)問(wèn)題,其范圍可以從細(xì)微的行為變化到嚴(yán)重到讓你的應(yīng)用程序崩潰并破壞用戶數(shù)據(jù)。

你需要考慮的另一個(gè)因素是你是否真的需要多線程或并發(fā)。多線程解決了如何在同一個(gè)進(jìn)程內(nèi)并發(fā)的執(zhí)行多路代碼路徑的問(wèn)題。然而在很多情況下你是無(wú)法保證你所在做的工作是并發(fā)的。多線程引入帶來(lái)大量的開銷,包括內(nèi)存消耗和CPU占用。你會(huì)發(fā)現(xiàn)這些開銷對(duì)于你的工作而言實(shí)在太大,或者有其他方法會(huì)更容易實(shí)現(xiàn)。

表1-1列舉了多線程的替代方法。該表包含了多線程的替代技術(shù)(比如操作對(duì)象和GCD)和如何更高效的使用單個(gè)線程。

Table 1-1  Alternative technologies to threads

Technology

Description

Operation objects

Introduced in Mac OS X v10.5, an operation object is a wrapper for a task that would normally be executed on a secondary thread. This wrapper hides the thread management aspects of performing the task, leaving you free to focus on the task itself. You typically use these objects in conjunction with an operation queue object, which actually manages the execution of the operation objects on one more threads.
For more information on how to use operation objects, see Concurrency Programming Guide.

Grand Central Dispatch (GCD)

Introduced in Mac OS x v10.6, Grand Central Dispatch is another alternative to threads that lets you focus on the tasks you need to perform rather than on thread management. With GCD, you define the task you want to perform and add it to a work queue, which handles the scheduling of your task on an appropriate thread. Work queues take into account the number of available cores and the current load to execute your tasks more efficiently than you could do yourself using threads.
For information on how to use GCD and work queues, see Concurrency Programming Guide

Idle-time notifications

For tasks that are relatively short and very low priority, idle time notifications let you perform the task at a time when your application is not as busy. Cocoa provides support for idle-time notifications using the NSNotificationQueue object. To request an idle-time notification, post a notification to the default NSNotificationQueue object using the NSPostWhenIdle option. The queue delays the delivery of your notification object until the run loop becomes idle. For more information, see Notification Programming Topics.

Asynchronous functions

The system interfaces include many asynchronous functions that provide automatic concurrency for you. These APIs may use system daemons and processes or create custom threads to perform their task and return the results to you. (The actual implementation is irrelevant because it is separated from your code.) As you design your application, look for functions that offer asynchronous behavior and consider using them instead of using the equivalent synchronous function on a custom thread.

Timers

You can use timers on your application’s main thread to perform periodic tasks that are too trivial to require a thread, but which still require servicing at regular intervals. For information on timers, see “Timer Sources.”

Separate processes

Although more heavyweight than threads, creating a separate process might be useful in cases where the task is only tangentially related to your application. You might use a process if a task requires a significant amount of memory or must be executed using root privileges. For example, you might use a 64-bit server process to compute a large data set while your 32-bit application displays the results to the user.

注意:當(dāng)使用fork函數(shù)加載獨(dú)立進(jìn)程的時(shí)候,你必須總是在fork后面調(diào)用exec或者類似的函數(shù)。基于Core Foundation、Cocao或者Core Data框架(無(wú)論顯式還是隱式關(guān)聯(lián))的應(yīng)用程序隨后調(diào)用exec函數(shù)或者類似的函數(shù)都會(huì)導(dǎo)出不確定的結(jié)果。

別走開,下頁(yè)內(nèi)容更精彩

#p#

4.線程支持

如果你已經(jīng)有代碼使用了多線程,Mac OS X和iOS提供幾種技術(shù)來(lái)在你的應(yīng)用程序里面創(chuàng)建多線程。此外,兩個(gè)系統(tǒng)都提供了管理和同步你需要在這些線程里面處理的工作。以下幾個(gè)部分描述了一些你在Mac OS X和iOS上面使用多線程的時(shí)候需要注意的關(guān)鍵技術(shù)。

4.1線程包

雖然多線程的底層實(shí)現(xiàn)機(jī)制是Mach的線程,你很少(即使有)使用Mach級(jí)的線程。相反,你會(huì)經(jīng)常使用到更多易用的POSIX 的API或者它的衍生工具。Mach的實(shí)現(xiàn)沒(méi)有提供多線程的基本特征,但是包括搶占式的執(zhí)行模型和調(diào)度線程的能力,所以它們是相互獨(dú)立的。

列表1-2列舉你可以在你的應(yīng)用程序使用的線程技術(shù)。

Table 1-2  Thread technologies

Technology

Description

Cocoa threads

Cocoa implements threads using the NSThread class. Cocoa also provides methods on NSObject for spawning new threads and executing code on already-running threads. For more information, see “Using NSThread” and “Using NSObject to Spawn a Thread.”

POSIX threads

POSIX threads provide a C-based interface for creating threads. If you are not writing a Cocoa application, this is the best choice for creating threads. The POSIX interface is relatively simple to use and offers ample flexibility for configuring your threads. For more information, see “Using POSIX Threads”

Multiprocessing Services

Multiprocessing Services is a legacy C-based interface used by applications transitioning from older versions of Mac OS. This technology is available in Mac OS X only and should be avoided for any new development. Instead, you should use the NSThread class or POSIX threads. If you need more information on this technology, see Multiprocessing Services Programming Guide.

在應(yīng)用層上,其他平臺(tái)一樣所有線程的行為本質(zhì)上是相同的。線程啟動(dòng)之后,線程就進(jìn)入三個(gè)狀態(tài)中的任何一個(gè):運(yùn)行(running)、就緒(ready)、阻塞(blocked)。如果一個(gè)線程當(dāng)前沒(méi)有運(yùn)行,那么它不是處于阻塞,就是等待外部輸入,或者已經(jīng)準(zhǔn)備就緒等待分配CPU。線程持續(xù)在這三個(gè)狀態(tài)之間切換,直到它最終退出或者進(jìn)入中斷狀態(tài)。

當(dāng)你創(chuàng)建一個(gè)新的線程,你必須指定該線程的入口點(diǎn)函數(shù)(或Cocoa線程時(shí)候?yàn)槿肟邳c(diǎn)方法)。該入口點(diǎn)函數(shù)由你想要在該線程上面執(zhí)行的代碼組成。但函數(shù)返回的時(shí)候,或你顯式的中斷線程的時(shí)候,線程永久停止,且被系統(tǒng)回收。因?yàn)榫€程創(chuàng)建需要的內(nèi)存和時(shí)間消耗都比較大,因此建議你的入口點(diǎn)函數(shù)做相當(dāng)數(shù)量的工作,或建立一個(gè)運(yùn)行循環(huán)允許進(jìn)行經(jīng)常性的工作。

為了獲取更多關(guān)于線程支持的可用技術(shù)并且如何使用它們,請(qǐng)閱讀“線程管理部分”。

4.2Run Loops

注:為了便于記憶,文本后面部分翻譯Run Loops的時(shí)候基本采用原義,而非翻譯為“運(yùn)行循環(huán)”。

一個(gè)run loop是用來(lái)在線程上管理事件異步到達(dá)的基礎(chǔ)設(shè)施。一個(gè)run loop為線程監(jiān)測(cè)一個(gè)或多個(gè)事件源。當(dāng)事件到達(dá)的時(shí)候,系統(tǒng)喚醒線程并調(diào)度事件到run loop,然后分配給指定程序。如果沒(méi)有事件出現(xiàn)和準(zhǔn)備處理,run loop把線程置于休眠狀態(tài)。

你創(chuàng)建線程的時(shí)候不需要使用一個(gè)run loop,但是如果你這么做的話可以給用戶帶來(lái)更好的體驗(yàn)。Run Loops可以讓你使用最小的資源來(lái)創(chuàng)建長(zhǎng)時(shí)間運(yùn)行線程。因?yàn)閞un loop在沒(méi)有任何事件處理的時(shí)候會(huì)把它的線程置于休眠狀態(tài),它消除了消耗CPU周期輪詢,并防止處理器本身進(jìn)入休眠狀態(tài)并節(jié)省電源。

為了配置run loop,你所需要做的是啟動(dòng)你的線程,獲取run loop的對(duì)象引用,設(shè)置你的事件處理程序,并告訴run loop運(yùn)行。Cocoa和Carbon提供的基礎(chǔ)設(shè)施會(huì)自動(dòng)為你的主線程配置相應(yīng)的run loop。如果你打算創(chuàng)建長(zhǎng)時(shí)間運(yùn)行的輔助線程,那么你必須為你的線程配置相應(yīng)的run loop。

關(guān)于run loops的詳細(xì)信息和如何使用它們的例子會(huì)在“Run Loops”部分介紹。

4.3同步工具

線程編程的危害之一是在多個(gè)線程之間的資源爭(zhēng)奪。如果多個(gè)線程在同一個(gè)時(shí)間試圖使用或者修改同一個(gè)資源,就會(huì)出現(xiàn)問(wèn)題。緩解該問(wèn)題的方法之一是消除共享資源,并確保每個(gè)線程都有在它操作的資源上面的獨(dú)特設(shè)置。因?yàn)楸3滞耆?dú)立的資源是不可行的,所以你可能必須使用鎖,條件,原子操作和其他技術(shù)來(lái)同步資源的訪問(wèn)。

鎖提供了一次只有一個(gè)線程可以執(zhí)行代碼的有效保護(hù)形式。最普遍的一種鎖是互斥排他鎖,也就是我們通常所說(shuō)的“mutex”。當(dāng)一個(gè)線程試圖獲取一個(gè)當(dāng)前已經(jīng)被其他線程占據(jù)的互斥鎖的時(shí)候,它就會(huì)被阻塞直到其他線程釋放該互斥鎖。系統(tǒng)的幾個(gè)框架提供了對(duì)互斥鎖的支持,雖然它們都是基于相同的底層技術(shù)。此外Cocoa提供了幾個(gè)互斥鎖的變種來(lái)支持不同的行為類型,比如遞歸。獲取更多關(guān)于鎖的種類的信息,請(qǐng)閱讀“鎖”部分內(nèi)容。

除了鎖,系統(tǒng)還提供了條件,確保在你的應(yīng)用程序任務(wù)執(zhí)行的適當(dāng)順序。一個(gè)條件作為一個(gè)看門人,阻塞給定的線程,直到它代表的條件變?yōu)檎妗.?dāng)發(fā)生這種情況的時(shí)候,條件釋放該線程并允許它繼續(xù)執(zhí)行。POSIX級(jí)別和基礎(chǔ)框架都直接提供了條件的支持。(如果你使用操作對(duì)象,你可以配置你的操作對(duì)象之間的依賴關(guān)系的順序確定任務(wù)的執(zhí)行順序,這和條件提供的行為非常相似)。

盡管鎖和條件在并發(fā)設(shè)計(jì)中使用非常普遍,原子操作也是另外一種保護(hù)和同步訪問(wèn)數(shù)據(jù)的方法。原子操作在以下情況的時(shí)候提供了替代鎖的輕量級(jí)的方法,其中你可以執(zhí)行標(biāo)量數(shù)據(jù)類型的數(shù)學(xué)或邏輯運(yùn)算。原子操作使用特殊的硬件設(shè)施來(lái)保證變量的改變?cè)谄渌€程可以訪問(wèn)之前完成。

獲取更多關(guān)于可用同步工具信息,請(qǐng)閱讀“同步工具”部分。

4.4線程間通信

雖然一個(gè)良好的設(shè)計(jì)最大限度地減少所需的通信量,但在某些時(shí)候,線程之間的通信顯得十分必要。(線程的任務(wù)是為你的應(yīng)用程序工作,但如果從來(lái)沒(méi)有使用過(guò)這些工作的結(jié)果,那有什么好處呢?)線程可能需要處理新的工作要求,或向你應(yīng)用程序的主線程報(bào)告其進(jìn)度情況。在這些情況下,你需要一個(gè)方式來(lái)從其他線程獲取信息。幸運(yùn)的是,線程共享相同的進(jìn)程空間,意味著你可以有大量的可選項(xiàng)來(lái)進(jìn)行通信。

線程間通信有很多種方法,每種都有它的優(yōu)點(diǎn)和缺點(diǎn)。“配置線程局部存儲(chǔ)”列出了很多你可以在Mac OS X上面使用的通信機(jī)制。(異常的消息隊(duì)列和Cocoa分布式對(duì)象,這些技術(shù)也可在iOS用來(lái)通信)。本表中的技術(shù)是按照復(fù)雜性的順序列出。

Table 1-3Communication mechanisms

Mechanism

Description

Direct messaging

Cocoa applications support the ability to perform selectors directly on other threads. This capability means that one thread can essentially execute a method on any other thread. Because they are executed in the context of the target thread, messages sent this way are automatically serialized on that thread. For information about input sources, see “Cocoa Perform Selector Sources.”

Global variables, shared memory, and objects

Another simple way to communicate information between two threads is to use a global variable, shared object, or shared block of memory. Although shared variables are fast and simple, they are also more fragile than direct messaging. Shared variables must be carefully protected with locks or other synchronization mechanisms to ensure the correctness of your code. Failure to do so could lead to race conditions, corrupted data, or crashes.

Conditions

Conditions are a synchronization tool that you can use to control when a thread executes a particular portion of code. You can think of conditions as gate keepers, letting a thread run only when the stated condition is met. For information on how to use conditions, see “Using Conditions.”

Run loop sources

A custom run loop source is one that you set up to receive application-specific messages on a thread. Because they are event driven, run loop sources put your thread to sleep automatically when there is nothing to do, which improves your thread’s efficiency. For information about run loops and run loop sources, see “Run Loops.”

Ports and sockets

Port-based communication is a more elaborate way to communication between two threads, but it is also a very reliable technique. More importantly, ports and sockets can be used to communicate with external entities, such as other processes and services. For efficiency, ports are implemented using run loop sources, so your thread sleeps when there is no data waiting on the port. For information about run loops and about port-based input sources, see “Run Loops.”

Message queues

The legacy Multiprocessing Services defines a first-in, first-out (FIFO) queue abstraction for managing incoming and outgoing data. Although message queues are simple and convenient, they are not as efficient as some other communications techniques. For more information about how to use message queues, see Multiprocessing Services Programming Guide.

Cocoa distributed objects

Distributed objects is a Cocoa technology that provides a high-level implementation of port-based communications. Although it is possible to use this technology for inter-thread communication, doing so is highly discouraged because of the amount of overhead it incurs. Distributed objects is much more suitable for communicating with other processes, where the overhead of going between processes is already high. For more information, seeDistributed Objects Programming Topics.

別走開,下頁(yè)內(nèi)容更精彩

#p#

5.設(shè)計(jì)技巧

以下各節(jié)幫助你實(shí)現(xiàn)自己的線程提供了指導(dǎo),以確保你代碼的正確性。部分指南同時(shí)提供如何利用你的線程代碼獲得更好的性能。任何性能的技巧,你應(yīng)該在你更改你代碼之前、期間、之后總是收集相關(guān)的性能統(tǒng)計(jì)數(shù)據(jù)。

5.1避免顯式創(chuàng)建線程

手動(dòng)編寫線程創(chuàng)建代碼是乏味的,而且容易出現(xiàn)錯(cuò)誤,你應(yīng)該盡可能避免這樣做。Mac OS X和iOS通過(guò)其他API接口提供了隱式的并發(fā)支持。你可以考慮使用異步API,GCD方式,或操作對(duì)象來(lái)實(shí)現(xiàn)并發(fā),而不是自己創(chuàng)建一個(gè)線程。這些技術(shù)背后為你做了線程相關(guān)的工作,并保證是無(wú)誤的。此外,比如GCD和操作對(duì)象技術(shù)被設(shè)計(jì)用來(lái)管理線程,比通過(guò)自己的代碼根據(jù)當(dāng)前的負(fù)載調(diào)整活動(dòng)線程的數(shù)量更高效。 關(guān)于更多GCD和操作對(duì)象的信息,你可以查閱“并發(fā)編程指南(Concurrency Programming Guid)”。

5.2保持你的線程合理的忙

如果你準(zhǔn)備人工創(chuàng)建和管理線程,記得多線程消耗系統(tǒng)寶貴的資源。你應(yīng)該盡最大努力確保任何你分配到線程的任務(wù)是運(yùn)行相當(dāng)長(zhǎng)時(shí)間和富有成效的。同時(shí)你不應(yīng)該害怕中斷那些消耗最大空閑時(shí)間的線程。線程使用一個(gè)平凡的內(nèi)存量,它的一些有線,所以釋放一個(gè)空閑線程,不僅有助于降低您的應(yīng)用程序的內(nèi)存占用,它也釋放出更多的物理內(nèi)存使用的其他系統(tǒng)進(jìn)程。線程占用一定量的內(nèi)存,其中一些是有線的,所以釋放空閑線程不但幫助你減少了你應(yīng)用程序的內(nèi)存印記,而且還能釋放出更多的物理內(nèi)存給其他系統(tǒng)進(jìn)程使用。

重要:在你中斷你的空閑線程開始之前,你必須總是記錄你應(yīng)用程序當(dāng)前的性能基線測(cè)量。當(dāng)你嘗試修改后,采取額外的測(cè)量來(lái)確保你的修改實(shí)際上提高了性能,而不是對(duì)它操作損害。

5.3避免共享數(shù)據(jù)結(jié)構(gòu)

避免造成線程相關(guān)資源沖突的最簡(jiǎn)單最容易的辦法是給你應(yīng)用程序的每個(gè)線程一份它需求的數(shù)據(jù)的副本。當(dāng)最小化線程之間的通信和資源爭(zhēng)奪時(shí)并行代碼的效果最好。

創(chuàng)建多線程的應(yīng)用是很困難的。即使你非常小心,并且在你的代碼里面所有正確的地方鎖住共享資源,你的代碼依然可能語(yǔ)義不安全的。比如,當(dāng)在一個(gè)特定的順序里面修改共享數(shù)據(jù)結(jié)構(gòu)的時(shí)候,你的代碼有可能遇到問(wèn)題。以原子方式修改你的代碼,來(lái)彌補(bǔ)可能隨后對(duì)多線程性能產(chǎn)生損耗的情況。把避免資源爭(zhēng)奪放在首位通常可以得到簡(jiǎn)單的設(shè)計(jì)同樣具有高性能的效果。

5.4多線程和你的用戶界面

如果你的應(yīng)用程序具有一個(gè)圖形用戶界面,建議你在主線程里面接收和界面相關(guān)的事件和初始化更新你的界面。這種方法有助于避免與處理用戶事件和窗口繪圖相關(guān)的同步問(wèn)題。一些框架,比如Cocoa,通常需要這樣操作,但是它的事件處理可以不這樣做,在主線程上保持這種行為的優(yōu)勢(shì)在于簡(jiǎn)化了管理你應(yīng)用程序用戶界面的邏輯。

有幾個(gè)顯著的例外,它有利于在其他線程執(zhí)行圖形操作。比如,QuickTime API包含了一系列可以在輔助線程執(zhí)行的操作,包括打開視頻文件,渲染視頻文件,壓縮視頻文件,和導(dǎo)入導(dǎo)出圖像。類似的,在Carbon和Cocoa里面,你可以使用輔助線程來(lái)創(chuàng)建和處理圖片和其他圖片相關(guān)的計(jì)算。使用輔助線程來(lái)執(zhí)行這些操作可以極大提高性能。如果你不確定一個(gè)操作是否和圖像處理相關(guān),那么你應(yīng)該在主線程執(zhí)行這些操作。

關(guān)于QuickTime線程安全的信息,查閱Technical Note TN2125:“QuickTime的線程安全編程”。關(guān)于Cocoa線程安全的更多信息,查閱“線程安全總結(jié)”。關(guān)于Cocoa繪畫信息,查閱Cocoa繪畫指南(Cocoa Drawing Guide)。

5.5了解線程退出時(shí)的行為

進(jìn)程一直運(yùn)行直到所有非獨(dú)立線程都已經(jīng)退出為止。默認(rèn)情況下,只有應(yīng)用程序的主線程是以非獨(dú)立的方式創(chuàng)建的,但是你也可以使用同樣的方法來(lái)創(chuàng)建其他線程。當(dāng)用戶退出程序的時(shí)候,通常考慮適當(dāng)?shù)牧⒓粗袛嗨歇?dú)立線程,因?yàn)橥ǔ*?dú)立線程所做的工作都是是可選的。如果你的應(yīng)用程序使用后臺(tái)線程來(lái)保存數(shù)據(jù)到硬盤或者做其他周期行的工作,那么你可能想把這些線程創(chuàng)建為非獨(dú)立的來(lái)保證程序退出的時(shí)候不丟失數(shù)據(jù)。

以非獨(dú)立的方式創(chuàng)建線程(又稱作為可連接的)你需要做一些額外的工作。因?yàn)榇蟛糠稚蠈泳€程封裝技術(shù)默認(rèn)情況下并沒(méi)有提供創(chuàng)建可連接的線程,你必須使用POSIX API來(lái)創(chuàng)建你想要的線程。此外,你必須在你的主線程添加代碼,來(lái)當(dāng)它們最終退出的時(shí)候連接非獨(dú)立的線程。更多有關(guān)創(chuàng)建可連接的線程信息,請(qǐng)查閱“設(shè)置線程的脫離狀態(tài)”部分。

如果你正在編程Cocoa的程序,你也可以通過(guò)使用applicationShouldTerminate:的委托方法來(lái)延遲程序的中斷直到一段時(shí)間后或者完成取消。當(dāng)延遲中斷的時(shí)候,你的程序需要等待直到任何周期線程已經(jīng)完成它們的任務(wù)且調(diào)用了replyToApplicationShouldTerminate:方法。關(guān)于更多這些方法的信息,請(qǐng)查閱NSApplication Class Reference。

5.6處理異常

當(dāng)拋出一個(gè)異常時(shí),異常的處理機(jī)制依賴于當(dāng)前調(diào)用堆棧執(zhí)行任何必要的清理。因?yàn)槊總€(gè)線程都有它自己的調(diào)用堆棧,所以每個(gè)線程都負(fù)責(zé)捕獲它自己的異常。如果在輔助線程里面捕獲一個(gè)拋出的異常失敗,那么你的主線程也同樣捕獲該異常失敗:它所屬的進(jìn)程就會(huì)中斷。你無(wú)法捕獲同一個(gè)進(jìn)程里面其他線程拋出的異常。

如果你需要通知另一個(gè)線程(比如主線程)當(dāng)前線程中的一個(gè)特殊情況,你應(yīng)該捕捉異常,并簡(jiǎn)單地將消息發(fā)送到其他線程告知發(fā)生了什么事。根據(jù)你的模型和你正在嘗試做的事情,引發(fā)異常的線程可以繼續(xù)執(zhí)行(如果可能的話),等待指示,或者干脆退出。

注意:在Cocoa里面,一個(gè)NSException對(duì)象是一個(gè)自包含對(duì)象,一旦它被引發(fā)了,那么它可以從一個(gè)線程傳遞到另外一個(gè)線程。

在一些情況下,異常處理可能是自動(dòng)創(chuàng)建的。比如,Objective-C中的@synchronized包含了一個(gè)隱式的異常處理。

5.7干凈地中斷你的線程

線程自然退出的最好方式是讓它達(dá)到其主入口結(jié)束點(diǎn)。雖然有不少函數(shù)可以用來(lái)立即中斷線程,但是這些函數(shù)應(yīng)僅用于作為最后的手段。在線程達(dá)到它自然結(jié)束點(diǎn)之前中斷一個(gè)線程阻礙該線程清理完成它自己。如果線程已經(jīng)分配了內(nèi)存,打開了文件,或者獲取了其他類型資源,你的代碼可能沒(méi)辦法回收這些資源,結(jié)果造成內(nèi)存泄漏或者其他潛在的問(wèn)題。

關(guān)于更多正確退出線程的信息,請(qǐng)查閱“中斷線程”部分。

5.8線程安全的庫(kù)

雖然應(yīng)用程序開發(fā)人員控制應(yīng)用程序是否執(zhí)行多個(gè)線程,類庫(kù)的開發(fā)者則無(wú)法這樣控制。當(dāng)開發(fā)類庫(kù)時(shí),你必須假設(shè)調(diào)用應(yīng)用程序是多線程,或者多線程之間可以隨時(shí)切換。因此你應(yīng)該總是在你的臨界區(qū)使用鎖功能。

對(duì)類庫(kù)開發(fā)者而言,只當(dāng)應(yīng)用程序是多線程的時(shí)候才創(chuàng)建鎖是不明智的。如果你需要鎖定你代碼中的某些部分,早期應(yīng)該創(chuàng)建鎖對(duì)象給你的類庫(kù)使用,更好是顯式調(diào)用初始化類庫(kù)。雖然你也可以使用靜態(tài)庫(kù)的初始化函數(shù)來(lái)創(chuàng)建這些鎖,但是僅當(dāng)沒(méi)有其他方式的才應(yīng)該這樣做。執(zhí)行初始化函數(shù)需要延長(zhǎng)加載你類庫(kù)的時(shí)間,且可能對(duì)你程序性能造成不利影響。

注意:永遠(yuǎn)記住在你的類庫(kù)里面保持鎖和釋放鎖的操作平衡。你應(yīng)該總是記住鎖定類庫(kù)的數(shù)據(jù)結(jié)構(gòu),而不是依賴調(diào)用的代碼提供線程安全環(huán)境。

如果你真正開發(fā)Cocoa的類庫(kù),那么當(dāng)你想在應(yīng)用程序變成多線程的時(shí)候收到通知的話,你可以給NSWillBecomeMultiThreadedNotification 注冊(cè)一個(gè)觀察者。不過(guò)你不應(yīng)用依賴于這些收到的通知,因?yàn)樗鼈兛赡茉谀愕念悗?kù)被調(diào)用之前已經(jīng)被發(fā)出了。

責(zé)任編輯:閆佳明 來(lái)源: dreamingwish
相關(guān)推薦

2013-07-16 10:57:34

iOS多線程多線程概念多線程入門

2013-07-16 12:13:27

iOS多線程多線程概念GCD

2013-07-16 13:39:11

2013-07-16 11:38:46

iOS多線程多線程概念GCD

2013-07-15 15:35:06

2011-08-09 14:24:18

iPhone多線程線程

2023-06-13 13:39:00

多線程異步編程

2009-03-12 10:52:43

Java線程多線程

2023-04-02 17:53:10

多線程編程自測(cè)

2023-06-06 08:17:52

多線程編程Thread類

2023-06-05 07:56:10

線程分配處理器

2023-06-07 13:49:00

多線程編程C#

2013-06-07 16:30:08

iOS多線程iOS開發(fā)NSThread

2011-06-13 10:41:17

JAVA

2021-08-12 14:33:20

Python多線程編程

2009-02-24 08:36:51

多線程線程池網(wǎng)絡(luò)服務(wù)器

2011-07-22 14:55:20

多線程

2011-06-13 10:03:19

Qt 多線程 編程

2009-07-29 16:42:35

Java多線程編程

2012-05-18 10:36:20

CC++編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

免费av手机在线观看| 国产日本欧美一区二区三区在线| 久久久久国产免费| 国产黄大片在线观看| 91丨九色丨尤物| 国产在线播放不卡| 精品在线免费观看视频| 国产麻豆一区二区三区精品视频| 欧美日韩精品久久久| 中国一级黄色录像| 天堂av资源在线| 日韩av中文在线观看| 色七七影院综合| 被黑人猛躁10次高潮视频| 筱崎爱全乳无删减在线观看| 亚洲国产精品国自产拍av| 亚洲自拍偷拍第一页| 欧美日韩乱国产| 亚洲xxx拳头交| 亚洲激情在线视频| 天天视频天天爽| 国产理论在线| 中文字幕亚洲一区二区av在线| 不卡一卡2卡3卡4卡精品在| 国产女主播喷水视频在线观看| 亚洲欧美综合久久久| 日韩精品中文字幕久久臀| 中文字幕一区二区在线观看视频 | 国产福利小视频在线观看| 国产九九视频一区二区三区| 国产精品免费小视频| 日韩av电影网| 国内精品美女在线观看| 久久精品国产精品亚洲| 亚洲精品国产精品国自产网站| 久久男人av| 欧美一区二区三区爱爱| 污视频网址在线观看| 欧美最新精品| 色妞www精品视频| 国产69精品久久久久999小说| 成码无人av片在线观看网站| 国产精品美女视频| 欧美精品一区在线| 欧美一区二区三区黄片| 国产高清在线观看免费不卡| 国产男人精品视频| 天天射天天干天天| 亚洲欧美大片| 欧美亚洲另类在线| 日韩美女一级片| 欧美激情在线| 欧美裸体xxxx极品少妇| 日韩精品123区| 国产精品成人a在线观看| 在线精品91av| 三区四区在线观看| 精品国产日韩欧美| 综合国产在线视频| 综合 欧美 亚洲日本| 欧美精品一区二区三区中文字幕| 亚洲精品资源美女情侣酒店| 黄色性生活一级片| 欧美交a欧美精品喷水| 亚洲国产精品va在线观看黑人| 麻豆免费在线观看视频| 9l视频自拍九色9l视频成人| 日韩欧美在线不卡| 日本wwww色| 在这里有精品| 日韩高清a**址| v8888av| 国产videos久久| 在线观看国产欧美| 男人av资源站| 日韩视频三区| 国产精品www色诱视频| 在线观看av大片| 国产精一品亚洲二区在线视频| 99久久久精品免费观看国产| 人妻视频一区二区三区| 国产婷婷色一区二区三区在线| 台湾成人av| 宅男在线观看免费高清网站| 黑人精品xxx一区一二区| 免费国产成人av| www.91精品| 亚洲国产一区二区三区在线观看| 欧洲美一区二区三区亚洲| 久久国产精品亚洲人一区二区三区| 久久综合国产精品台湾中文娱乐网| 国产小视频在线观看免费| 香蕉成人久久| 91精品综合久久久久久五月天| 蜜臀av中文字幕| 久久久久久久久免费| 久久99国产精品一区| 理论片午夜视频在线观看| 欧美日韩在线亚洲一区蜜芽| 国产免费a级片| 欧洲美女日日| 98视频在线噜噜噜国产| 亚洲香蕉在线视频| 91丨porny丨在线| 一区二区三区欧美成人| 欧美久久天堂| 精品久久人人做人人爱| 9.1片黄在线观看| 国产日产高清欧美一区二区三区| 国产专区精品视频| 可以在线观看的黄色| 一区二区三区四区国产精品| 又色又爽又高潮免费视频国产| gogo久久日韩裸体艺术| 亚洲日本中文字幕| 日本一二三区视频| 国产在线国偷精品产拍免费yy| 久久久久天天天天| 欧美hdxxxx| 欧美日韩国产三级| 久久久久久九九九九九| 在线成人黄色| 99久久99久久精品国产片| 天堂资源在线中文| 色94色欧美sute亚洲线路一ni| 在线精品视频播放| 综合一区二区三区| 国产又爽又黄的激情精品视频| 精品资源在线看| 婷婷丁香激情综合| 国产亚洲精品成人a| 在线一区免费| 91在线网站视频| 蜜桃视频在线观看www社区| 欧洲一区二区av| 久久国产精品无码一级毛片| 亚洲人成高清| 国产福利久久| 2021中文字幕在线| 亚洲国产精品女人久久久| 国产一级视频在线播放| 国产成人8x视频一区二区| 国产欧美综合一区| 成人黄色91| 欧美成人合集magnet| 国产同性人妖ts口直男| 最近日韩中文字幕| 亚洲精品在线网址| 欧美区日韩区| 国产精品久久国产三级国电话系列 | 国产激情91久久精品导航| 男女啪啪的视频| 99精品美女视频在线观看热舞| 日韩中文视频免费在线观看| 在线观看亚洲一区二区| 中文字幕一区二区三| 99精品视频免费版的特色功能| 一区二区三区四区电影| 91视频免费在线观看| 青春草免费在线视频| 亚洲第一网站男人都懂| 久热这里只有精品6| 久久久www成人免费无遮挡大片| 日韩视频免费在线播放| 99久久影视| 99九九视频| 中文在线免费视频| 国产亚洲精品久久久久久牛牛| 国产裸体美女永久免费无遮挡| 欧美激情一区二区三区在线| 午夜啪啪小视频| 黑人一区二区| 欧美日韩一区综合| 99热这里有精品| 国模精品视频一区二区三区| 青青草在线视频免费观看| 欧美亚洲一区二区在线观看| 国产一区二区精彩视频| 国产91精品一区二区| 黑人糟蹋人妻hd中文字幕| 欧美激情成人| 国产精品二区二区三区| 日韩在线免费| 九九热最新视频//这里只有精品| 色网站免费观看| 欧美日韩久久一区| 国产一级片播放| 国产欧美精品一区| 中文字幕一区二区三区四| 国产精品毛片在线看| 最新国产精品久久| 亚洲区小说区图片区qvod按摩| 成人看片人aa| 免费v片在线观看| 久久天堂电影网| 欧美色视频免费| 欧美一区午夜视频在线观看| 国产美女激情视频| 亚洲黄色性网站| 精品无码人妻一区二区免费蜜桃| 国产成人精品一区二区三区网站观看| 日韩黄色片视频| 欧美日本中文| 亚洲精品中文字幕在线| 欧美黑白配在线| 99re在线| 欧美性www| 国产成人精品一区| xxxx另类黑人| 美乳少妇欧美精品| 尤物视频在线免费观看| 日韩一级黄色片| 中文在线免费看视频| 欧美性感美女h网站在线观看免费| 日本一级特级毛片视频| 久久久亚洲欧洲日产国码αv| 久久久无码人妻精品无码| 久久精品久久综合| 热久久精品国产| 影音先锋中文字幕一区| 日韩精品福利片午夜免费观看| 俺要去色综合狠狠| 欧美精品人人做人人爱视频| 麻豆一区二区麻豆免费观看| 91精品国产99久久久久久红楼 | 亚洲影院一区| 国产资源在线免费观看| 综合一区在线| 欧美性受黑人性爽| 欧美r级电影| 亚洲一区bb| 日韩成人激情| 少妇特黄a一区二区三区| 老牛国内精品亚洲成av人片| 不卡视频一区二区三区| 永久免费精品视频| 动漫一区二区在线| 136福利精品导航| 国产91精品入口17c| 综合中文字幕| 国产一区二区免费电影| 久久久伦理片| 牛人盗摄一区二区三区视频| 秋霞影院一区二区三区| 国模精品娜娜一二三区| 国产在线播放精品| 国产高清一区视频| 全国精品免费看| 久久精品中文字幕一区二区三区 | 99国产精品久久久久久久久久 | gogo亚洲国模私拍人体| 国产麻豆精品theporn| 波多野结衣在线免费观看| 国产主播一区二区| 亚洲欧美一区二区三区不卡| 国产精品一区二区在线播放| 国产人妖在线观看| 白白色亚洲国产精品| 一区二区三区免费在线观看视频| 久久综合国产精品| 亚洲成人黄色av| 国产精品美女久久久久久2018 | 91深夜福利视频| 欧美a级大片在线| 成人综合电影| 亚洲人成网www| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 婷婷综合网站| 大陆av在线播放| 免费在线日韩av| xx欧美撒尿嘘撒尿xx| 国内精品久久久久影院一蜜桃| 欧美图片自拍偷拍| 久久综合久久久久88| 中文字幕第24页| 亚洲男同1069视频| 国产又爽又黄的视频| 精品视频1区2区3区| 精品国产无码一区二区三区| 精品视频在线播放| 免费av网站在线观看| 欧美激情综合亚洲一二区| 免费福利视频一区二区三区| 成人国产亚洲精品a区天堂华泰| 视频精品二区| 欧美重口乱码一区二区| 中文字幕免费一区二区| 国产无套内射久久久国产| 另类小说欧美激情| 精品视频站长推荐| 国产精品女主播在线观看| 久久久无码一区二区三区| 91国偷自产一区二区三区观看| 国产伦理吴梦梦伦理| 亚洲免费成人av电影| 国产在线观看a视频| 欧美在线www| 久久久久久爱| 日本一区高清在线视频| 欧美日韩国产一区精品一区| av丝袜天堂网| 99热国产精品| 全网免费在线播放视频入口| 色八戒一区二区三区| 亚洲av无码国产精品永久一区| 国产午夜精品一区理论片飘花| 国产乱码在线| 91久久国产精品91久久性色| 国产一区二区三区四区| 国产一区二区三区播放| 日韩电影免费一区| 粉嫩av懂色av蜜臀av分享| 亚洲狠狠丁香婷婷综合久久久| 欧美人一级淫片a免费播放| 亚洲成人教育av| 18+激情视频在线| 国产一区私人高清影院| 宅男在线一区| 黄色一级片在线看| 国产一区在线精品| 奇米网一区二区| 色哟哟国产精品| 亚洲aaa在线观看| 国内精品一区二区三区| 白嫩白嫩国产精品| 偷拍盗摄高潮叫床对白清晰| 免费人成在线不卡| 一区二区伦理片| 91成人免费网站| 男人的天堂在线视频| 亚州欧美日韩中文视频| caoporn成人| 青青草国产免费| 国产成人精品一区二区三区四区| 乱h高h女3p含苞待放| 欧美日韩精品一区二区| eeuss影院www在线观看| 国产精品成人免费电影| 真实原创一区二区影院| 国产a视频免费观看| 91老司机福利 在线| 制服.丝袜.亚洲.中文.综合懂色| 亚洲福利在线播放| 国产免费拔擦拔擦8x在线播放| 国产激情一区二区三区在线观看 | 日韩免费视频| jizz欧美性11| 136国产福利精品导航| 国产剧情久久久| 成人97在线观看视频| 我要色综合中文字幕| 国产在线视频在线| 成人中文字幕合集| 亚洲欧美在线视频免费| 精品视频在线播放免| 香蕉成人影院| 一区二区av| 国产精品一区二区久久不卡| 男女免费视频网站| 亚洲国产精品一区二区久| 在线免费av资源| 日韩在线电影一区| 久久成人麻豆午夜电影| 国产盗摄x88av| 日韩电影中文字幕在线| 成人精品电影在线| 一本一本久久a久久精品综合妖精| 韩国精品免费视频| 久久久综合久久久| 亚洲精品国产精品乱码不99按摩| 中文在线8资源库| 最新欧美日韩亚洲| 暴力调教一区二区三区| 无码一区二区三区在线观看| 久久精品国产一区二区三区| 91综合久久爱com| 国产福利视频在线播放| 一区精品在线播放| 亚洲国产精品国自产拍久久| 日本在线精品视频| 99精品视频在线| 小毛片在线观看| 欧美视频一区二| 欧美韩日亚洲| 日韩在线观看电影完整版高清免费| 国产毛片精品一区| 九九热在线免费观看| 爱福利视频一区| 欧美天堂社区| www.午夜av| 色综合一区二区| aa在线视频| 日本三级中国三级99人妇网站| 国产综合久久久久久久久久久久| 日韩黄色精品视频| 精品国产欧美一区二区五十路| 粉嫩久久久久久久极品| 欧美大尺度做爰床戏| 亚洲成在人线在线播放| 麻豆电影在线播放|