多線程(IOS)學習筆記

來源:互聯網
上載者:User

1、除了鎖,系統還提供了條件,確保在你的應用程式任務執行的適當順序。一個條 件作為一個看門人,阻塞給定的線程,直到它代表的條件變為真。當發生這種情況的 時候,條件釋放該線程並允許它繼續執行

 (如果你使用操作對象,你可以配置你的操作對象之間的依賴關係的順序確 定任務的執行順序,這和條件提供的行為非常相似)。

 2、可以通過使用 applicationShouldTerminate: 的委託方法來延遲程式的中斷直到一段時間後或者完成取消。當延遲中斷的時候,你 的程式需要等待直到任何周期線程(可連接線程)已經完成它們的任務且調用了 replyToApplicationShouldTerminate:方法。關於更多這些方法的資訊,請查閱
NSApplication Class Reference。
3、The minimum allowed stack size for secondary threads is 16 KB and the stack size must be a multiple of 4 KB

512 KB(secondary threads) 8 MB (Mac OS X main thread) 1 MB (iOS main thread)
 4、對於多線程的應用程式,Cocoa 架構使用鎖和其他同步方式來保證代碼的正確執行。為了防止這些鎖造成在單線程裡面效能的損失,Cocoa 直到應用程式使用 NSThread 類產生它的第一個新的線程的時候才建立這些鎖。因此當你僅使用 POSIX 常式來產生新的線程,Cocoa 不會收到關於你的應用程式當前變為多線程的通知,為了讓 Cocoa 知道你正打算使用多線程,你所需要做的是使用 NSThread 類產生
一個線程,並讓它立即退出,只需要使用 NSThread 來產生一個線程就足夠保證 Cocoa 架構所需的鎖到位。可以使用 NSThread 的 isMultiThreaded 方法來檢驗一下。

5、每個線程都維護了一個鍵-值的字典,它可以線上程裡面的任何地方被訪問。你 可以使用該字典來儲存一些資訊,這些資訊在整個線程的執行過程中都保持不變。
在 Cocoa 裡面,你使用 NSThread 的 threadDictionary 方法來檢索一個 NSMutableDictionary 對象,你可以在它裡面添加任何線程需要的鍵。在 POSIX 裡面,
你使用 pthread_setspecific 和 pthread_getspecific 函數來設定和訪問你線程的鍵 和值。

 6、可連接線 程可以傳遞一個資料指標或者其他傳回值給 pthread_exit 函數。其他線程可以通過 pthread_join 函數來拿到這些資料。

 重要:在應用程式退出時,脫離線程可以立即被中斷,而可連接線程則不可以。每個可串連 線程必須在進程被允許可以退出的時候被串連。所以當線程處於周期性工作而不允許被中斷的時 候,比如儲存資料到硬碟,可連接線程是最佳選擇 。參見2

建立可連接線程,唯一的辦法是使用 POSIX 線程。POSIX 預設建立的線程是可串連的。為了把線程標記為脫離的或可串連的,使用 pthread_attr_setdetachstate 函數來修改正在建立的線程的屬性。線上程啟動後,
你可以通過調用 pthread_detach 函數來把脫離線程修改為可串連的。
改變線程的優先順序,Cocoa 線程使用 NSThread 的 setThreadPriority:類方法。 POSIX 線程,使用 pthread_setschedparam 函數。

7、在你編寫線程主體入口的時候第一件事情 就是建立一個自動釋放池。在你線程的主 體進入點安裝一個 try/catch 模組,可以讓你捕獲任何未知的異常,並提供一個合適 的響應。
8、當在其他線程上面執行 selector 時,目標線程須有一個活動的 run loop。  為了給 run loop 添加一個觀察者,你可以建立 CFRunLoopObserverRef 不透明類
型,並使用 CFRunLoopAddObserver 將它添加到你的 run loop。Run
loop 觀察者必須由 Core foundation 函數建立,即使是 Cocoa 程式

退出 Run Loop

有兩種方法可以讓 run loop 處理事件之前退出: 給 run loop 設定逾時時間 通知 run loop 停止,使用 CFRunLoopStop 來顯式的停止 run
loop

9、如果多個線程同時運行,訊號被傳遞到任何一個系統挑選的線程。換而言之,訊號 可以傳遞給你應用的任何線程。在你應用程式裡面實現訊號處理的第一條規則是避免假設任一線程處理訊號
10、當兩個不同 的線程分別保持一個鎖(而該鎖是另外一個線程需要的)又試圖獲得另外線程保持的 鎖時就會發生死結。
 活鎖和死結類似,當兩個線程競爭同一個資源的時候就可能發生活鎖。在發 生活鎖的情況裡,一個線程放棄它的第一個鎖並試圖獲得第二個鎖。一旦它獲得第二個鎖,它返回並試圖再次獲得一個鎖。線程就會被鎖起來,因為它花費所有的時間來 釋放一個鎖,並試圖擷取其他鎖,而不做實際的工作。

 避免死結和活鎖的最好方法是同一個時間只擁有一個鎖。如果你必須在同一時間 擷取多於一個鎖,你應該確保其他線程沒有做類似的事情

 11、@synchronized 指令是在 Objective-C 代碼中建立一個互斥鎖非常方便的方法。

作為一種預防措施,@synchronized 塊隱式的添加一個異常處理常式來保護代碼。

該處理常式會在異常拋出的時候自動的釋放互斥鎖。這意味著為了使用 @synchronized 指令,你必須在你的代碼中啟用異常處理

NSRecursiveLock 類定義的鎖可以在同一線程多次獲得,而不會造成死結

12、NSConditionLock 對象定義了一個互斥鎖,可以使用特定值來鎖住和解鎖。不要 把該類型的鎖和條件(參見“條件”部分)混淆了:lock unlock
而NSCondition:lock wait signal unlock當多線程需要以特定的順序來執行任務的時候,你可以使用一個 NSConditionLock 對象,比如當一個線程生產資料,而另外一個線程消費資料。生產 者執行時,消費者使用由你程式指定的條件來擷取鎖(條件本身是一個你定義的整形 值)。當生產者完成時,它會解鎖該鎖並設定鎖的條件為合適的整形值來喚醒消費者
線程,之後消費線程繼續處理資料。

13、NSDistributedLock 類可以被多台主機上的多個應用程式使用來限制對某些共用 資源的訪問,比如一個檔案。

 

  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.